NEKO's Maze Game-cf

  题意:给你一个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;
} 

猜你喜欢

转载自www.cnblogs.com/qq2210446939/p/12227230.html