题意:给你一个2×n的矩阵,起点在左上,终点在右下,可以移动到本格相邻的格子里,给你q个时间点,每个时间点会有一个格子的状态发生变化,格子状态分为可走和不可走,一开始所以格子都是可走的,要求输出每个时间点能不能从起点走到终点。
思路:对任意格子来说,设它的坐标为x,y,对于他的另一行的三个坐标3-x,y-1 ,3-x,y和3-x,y+1有一个是不可走的,整个道路就被塞死了,就无法从起点走到终点。也就是说整个矩阵任意一个点满足这种关系,整条路走不通,所以我们统计整个矩阵有多少组这种关系设为num,对于每个时间点,如果它是让格子解除封印,就将num减去它能减少的组数,相对应封禁格子就是让num加,在每一个时间点判断一下num是不是为0就行了。
ac代码:
#include<iostream> using namespace std; const int maxn=1e5+10; int n,q; int vis[3][maxn]; int ans[maxn];//0可以,1不行 int check(int x,int y){ int h=3-x; if(y==1){ return vis[h][y]+vis[h][y+1]; } else if(y==n){ return vis[h][y-1]+vis[h][y]; } else return vis[h][y-1]+vis[h][y]+vis[h][y+1]; } int main() { cin>>n>>q; int x,y,num=0,now=0; for(int i=1;i<=q;i++){ cin>>x>>y; if(vis[x][y]==0){ num-=check(x,y); } else{ num+=check(x,y); } if(num==0) ans[i]=0; else ans[i]=1; vis[x][y]^=1; } for(int i=1;i<=q;i++){ if(ans[i]==0) cout<<"Yes\n"; else cout<<"No\n"; } return 0; }
NEKO's Maze Game-cf
原文地址:https://www.cnblogs.com/qq2210446939/p/12227230.html
时间: 2024-10-31 02:18:09