题意:给你一个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;
}
来源:https://www.cnblogs.com/qq2210446939/p/12227230.html