题意

https://vjudge.net/problem/CodeForces-1236D

最近,爱丽丝得到了一个新玩偶。它甚至可以走路!

爱丽丝为玩偶建造了一个迷宫,并想对其进行测试。迷宫具有n行和m列。有k个障碍物,第i个障碍物位于单元格(xi,yi​)上,这意味着第xi​个行与第yi​列相交的单元格上存在一个禁止通过的障碍物。

然而,玩偶有着缺陷。在同一单元格(包括起始单元格)中,它最多只能笔直走或右转一次。它无法进入有障碍物的单元格或走出迷宫的界限之外。

现在,爱丽丝正在控制娃娃的动作。她将玩偶放入单元格(1,1)(即迷宫的左上角)中。最初,玩偶的朝向从(1,1)向着(1,m)。她想让玩偶恰好穿过一次所有单元格而没有障碍,玩偶的行动可以在任何地方结束。爱丽丝的想法可以实现吗?

思路

这题细节非常多,但是也很好写,直接模拟就行了。但是一步一步的走肯定会T,我们可以维护每一行、每一列的障碍物,上下左右边界,每次走的时候直接跳到最近的障碍物前面即可。

注意几个坑:

1.(1,1)正前方(1,2)有障碍物,可以直接右转,这里要特判一下。

2.每跳一次,判断前面那个位置是否是不可行的点,这里我用上述的上下左右边界判断,如果是,那么走不通了,break即可。

代码

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int N=200005;
const int mod=1e9+7;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
vector<ll> g[N],gg[N];
int main()
{
std::ios::sync_with_stdio(false);
ll n,m,k;
cin>>n>>m>>k;
int bb=0;
for(int i=1; i<=k; i++)
{
ll x,y;
cin>>x>>y;
g[x].push_back(y);
gg[y].push_back(x);
}
ll l=1,r=m,u=1,d=n;
ll x=1,y=1,sum=1;
if(k==0)
{
cout<<"Yes"<<endl;
return 0;
}
int sz=g[x].size(),flag=0;
if(sz==m-1)
flag=1;
ll t;//最近的符合要求的位置+1
while(1)
{
if(!flag)
{
sz=g[x].size();
t=r+1;
for(int i=0; i<sz; i++)
{
if(g[x][i]>y)
t=min(t,g[x][i]);
}
if(t-y==1)
break;
sum+=t-y-1,y=t-1,r=t-1-1,u=x+1;
}
// cout<<x<<" "<<y<<" "<<sum<<endl;
// cout<<l<<" "<<r<<" "<<u<<" "<<d<<endl;
sz=gg[y].size();
t=d+1;
for(int i=0; i<sz; i++)
{
if(gg[y][i]>x)
{
t=min(t,gg[y][i]);
}
}
if(t-x==1)
break;
sum+=t-x-1,x=t-1,d=t-1-1;
// cout<<x<<" "<<y<<" "<<sum<<endl;
// cout<<l<<" "<<r<<" "<<u<<" "<<d<<endl;
sz=g[x].size();
t=l-1;
for(int i=0; i<sz; i++)
{
if(g[x][i]<y)
{
t=max(t,g[x][i]);
}
}
if(y-t==1)
break;
sum+=y-t-1,y=t+1,l=t+1+1;
// cout<<x<<" "<<y<<" "<<sum<<endl;
// cout<<l<<" "<<r<<" "<<u<<" "<<d<<endl;
sz=gg[y].size();
t=u-1;
for(int i=0; i<sz; i++)
{
if(gg[y][i]<x)
{
t=max(t,gg[y][i]);
}
}
if(x-t==1)
break;
sum+=x-t-1,x=t+1,u=t+1+1;
// cout<<x<<" "<<y<<" "<<sum<<endl;
// cout<<l<<" "<<r<<" "<<u<<" "<<d<<endl;
}
// cout<<sum<<endl;
if(sum+k==n*m)
{
cout<<"Yes"<<endl;
}
else
cout<<"No"<<endl;
return 0;
}
/*
2 2 2
1 2
2 2
*/

  

CodeForces 1236D(模拟)的更多相关文章

  1. CodeForces - 427B (模拟题)

    Prison Transfer Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Sub ...

  2. CodeForces - 404B(模拟题)

    Marathon Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Submit Sta ...

  3. Codeforces 709B 模拟

    B. Checkpoints time limit per test:1 second memory limit per test:256 megabytes input:standard input ...

  4. CodeForces - 404A(模拟题)

    Valera and X Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Submit ...

  5. Codeforces 390A( 模拟题)

    Inna and Alarm Clock Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64 ...

  6. Codeforces 452D [模拟][贪心]

    题意: 给你k件衣服处理,告诉你洗衣机烘干机折叠机的数量,和它们处理一件衣服的时间,要求一件衣服在洗完之后必须立刻烘干,烘干之后必须立刻折叠,问所需的最小时间. 思路: 1.按照时间模拟 2.若洗完的 ...

  7. CodeForces - 796B 模拟

    思路:模拟移动即可,如果球落入洞中停止移动.注意:有可能第一个位置就是洞!! AC代码 #include <cstdio> #include <cmath> #include ...

  8. CodeForces - 864C-Bus-(模拟加油站问题)

    https://vjudge.net/problem/CodeForces-864C 题意:两地之间有个加油站,往返走k个单程,最少加油多少次. 大佬几十行代码就解决,我却要用一百多行的if语句模拟解 ...

  9. Codeforces 709C 模拟

    C. Letters Cyclic Shift time limit per test:1 second memory limit per test:256 megabytes input:stand ...

随机推荐

  1. 使用Graphviz和Pyreverse绘制Python项目结构图

    使用Graphviz和Pyreverse绘制Python项目结构图 简介 Graphviz开源的图形绘制工具包 Pyreverse分析Python代码和类关系的工具 安装 安装Graphviz 官网下 ...

  2. cookie,webstorage的理解

    在前两天的开发时,遇到一个问题,需要将一个网页在预加载时,优先出一个弹出框,但是再次加载时不希望它出现,在经过一段时间的搜索和尝试之后,发现了大多使用的两种方式:生成cookie和webStorage ...

  3. Error creating bean with name 'sqlSessionFactory' defined in class path resource [config/spring/applicationContext.xml]: Invocation of init method failed;

    我报的错: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSes ...

  4. 【心得】Lattice EPC3 PCS使用经验

    [博客导航] [导航]FPGA相关 一.目的 将使用过程中遇到的问题随时记录,共享经验心得. 二.心得随笔 1.仿真脚本 为避免生成PCS IP之后,仿真时忘记添加参数文件,可以在仿真脚本中添加以下代 ...

  5. qt用于图片显示的窗口

     用于图片显示的窗口 国产化  

  6. Where does Oracle SQL Developer store connections? oracle SQL Developer 连接信息保存的位置,什么地方

    oracle SQL Developer 连接信息保存的位置,在什么地方? 在切换登录用户后,oracle SQL Developer 连接信息不见了.只要以前的用户信息还存在,可以在路径 C:\Us ...

  7. c++用流控制成员函数输出数据

    #include<iostream> #include<iomanip> using namespace std; int main() { ; double b=314159 ...

  8. nui-app 笔记

    https://uniapp.dcloud.io

  9. 黑科技,利用python拨打电话,控制手机技术!

    跟selenium操作浏览器原理类似,这是用appium操作移动设备的一个自动化功能,自娱自乐,主要是通过小案例引出相关技术 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很 ...

  10. 前端 用http-server启动本地服务器

    附:http-server详细介绍,包括参数等:  https://www.npmjs.com/package/http-server 开始: 准备node.js环境: 在我的博文“  Vue.js学 ...