bfs+规律——cf1350E

没啥思维难度。。就是找到一个格子第一次开始变色的时间点f[i][j],再往后这个格子必定会每个时间改变一次颜色

处理出第一次就变颜色的格子,然后用bfs进行扩展,找周围没被扩展过的,且初始颜色不同的格子

#include<bits/stdc++.h>
using namespace std;
#define N 1005
#define ll long long

int n,m,t;
char mp[N][N];

int f[N][N];//每个格子第一次改变颜色时的时间 
void prework(){ 
    queue<pair<int,int> >q;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            if(i+1<=n && mp[i][j]==mp[i+1][j]){
                q.push(make_pair(i,j));
                f[i][j]=1;
            }
            else if(i-1>=1 && mp[i][j]==mp[i-1][j]){
                q.push(make_pair(i,j));
                f[i][j]=1;
            }
            else if(j+1<=m && mp[i][j]==mp[i][j+1]){
                q.push(make_pair(i,j));
                f[i][j]=1;
            }
            else if(j-1>=1 && mp[i][j]==mp[i][j-1]){
                q.push(make_pair(i,j));
                f[i][j]=1;
            }
        }
    while(q.size()){
        auto p=q.front();q.pop();
        int i=p.first,j=p.second;//把周围同色的加入queue     
        if(i+1<=n && mp[i][j]!=mp[i+1][j] && !f[i+1][j]){
            q.push(make_pair(i+1,j));
            f[i+1][j]=f[i][j]+1;
        }
        if(i-1>=1 && mp[i][j]!=mp[i-1][j] && !f[i-1][j]){
            q.push(make_pair(i-1,j));
            f[i-1][j]=f[i][j]+1;
        }
        if(j+1<=m && mp[i][j]!=mp[i][j+1] && !f[i][j+1]){
            q.push(make_pair(i,j+1));
            f[i][j+1]=f[i][j]+1;
        }
        if(j-1>=1 && mp[i][j]!=mp[i][j-1] && !f[i][j-1]){
            q.push(make_pair(i,j-1));
            f[i][j-1]=f[i][j]+1;
        }
    }
}

int main(){
    cin>>n>>m>>t;
    for(int i=1;i<=n;i++)
        scanf("%s",mp[i]+1);
    prework();
    
    while(t--){
        int i,j;ll p;
        scanf("%d%d%lld",&i,&j,&p);
        if(n==1 && m==1){
            cout<<mp[i][j]<<'\n';
            continue;
        }
        if(f[i][j]==0){
            cout<<mp[i][j]<<'\n';
        }
        else if(p<=f[i][j]-1){
            cout<<mp[i][j]<<'\n';
        }else {
            p-=f[i][j]-1;
            p%=2;
            int ans=mp[i][j]-'0';
            if(p)cout<<(ans^1)<<'\n';
            else cout<<ans<<'\n';
        }
    }
}

猜你喜欢

转载自www.cnblogs.com/zsben991126/p/12894601.html
今日推荐