CodeForces 1236D(模拟)
Posted mcq1999
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeForces 1236D(模拟)相关的知识,希望对你有一定的参考价值。
题意
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(模拟)的主要内容,如果未能解决你的问题,请参考以下文章
[Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3)][C. Playing Piano](代码片段