题意

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. 【Nginx】安装&环境配置

    安装依赖包 安装make:yum -y install gcc automake autoconf libtool make 安装g++:yum -y install gcc gcc-c++ 安装pc ...

  2. SQL高效运行注意事项(四)

    为了SQLSERVER能高效运行,SQLSERVER的磁盘子系统是一个重要的方面 Avg. Disk Sec/Read 这个计数器是指每秒从磁盘读取数据的平均值 下面的列表显示这个计数器值的范围,并指 ...

  3. go语言设计模式之observer

    observer.go package observer import ( "fmt" ) type Observer interface { Notify(string) } t ...

  4. 操作系统|VirtualBox for Mac(虚拟机软件)

    VirtualBox是德国一家软件公司InnoTek所开发的虚拟系统软件,它不仅具有丰富的特色,而且性能也很优异,更是开源的,成为了一个发布在GPL许可之下的自由软件.VirtualBox 可以在 L ...

  5. promise 和 setTimeout 在任务队列的执行顺序

    setTimeout(() => { console.log() }); const a = new Promise((resolve,reject)=>{ console.log(); ...

  6. WPF 动态生成对象属性 (dynamic)

    原文:WPF 动态生成对象属性 (dynamic) 项目中列行的数据 都需要动态生成 所以考虑到对象绑定  可需要一个动态生成属性的意思 缺点 加载速度会慢 很明显的慢 解决办法 尽量减轻动态属性的量 ...

  7. 新手入门:python的安装(一)

    windows下python的安装 -----因为我是个真小白,网上的大多入门教程并不适合我这种超级超级小白,有时候还会遇到各种各样的问题,因此记录一下我的安装过程,希望大家都能入门愉快,欢迎指教 - ...

  8. python-13-集合增删查

    前言 集合:可变的数据类型,但元素必须是不可变的数据类型,无序不重复,既可哈希.所以python的集合是不能进行修改的,只有增删查.可哈希.不可变数据类型有:元组.bool.int.str 一.增 1 ...

  9. 【文本处理命令】之grep搜索命令详解

    一.grep搜索命令 在日常使用中grep命令也是会经常用到的一个搜索命令.grep命令用于在文本中执行关键词搜索,并显示匹配的结果. 格式: grep [选项] [文件] Usage: grep [ ...

  10. 【面试】Java中sleep和wait的区别

    1.sleep方法是Thread类的静态方法: wait方法是Object类的成员方法 2.sleep方法使当前线程暂停执行指定的时间,让出cpu给其他线程,但是它的监控状态依然保持着,当指定的时间到 ...