​C. Orac and Game of Life​

参考:​​Codeforces Round #641 Editorial​

要注意到可能会有多块区域会同时发生变化,那么这个时候就不能用 dfs 来写了,考虑到它的同时性,那么就可以用 bfs 来写

将思维转化为代码的能力。

// Created by CAD on 2020/5/16.
#include <bits/stdc++.h>

#define fi first
#define se second
#define pii pair<int,int>
#define ll long long
using namespace std;

const int maxn=1e3+5;
int g[maxn][maxn],f[maxn][maxn];
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int n,m;

bool check(int _x,int _y){
for(int i=0;i<4;++i){
int x=_x+dx[i],y=_y+dy[i];
if(x<1||x>n||y<1||y>m) continue;
if(g[x][y]==g[_x][_y]) return 1;
}
return 0;
}
void bfs(){
queue<pii> q;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
if(check(i,j))
q.push({i,j}),f[i][j]=1;
while(!q.empty()){
pii now=q.front();q.pop();
int _x=now.fi,_y=now.se;
for(int i=0;i<4;++i){
int x=_x+dx[i],y=_y+dy[i];
if(x<1||x>n||y<1||y>m||f[x][y]) continue;
f[x][y]=f[_x][_y]+1;
q.push({x,y});
}
}
}

int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int t;cin>>n>>m>>t;
for(int i=1;i<=n;++i){
string s;cin>>s;
for(int j=0;j<m;++j)
g[i][j+1]=s[j]-'0';
}
bfs();
while(t--){
ll x,y,p;cin>>x>>y>>p;
p++;
if(f[x][y])
cout << (p<=f[x][y]?g[x][y]:g[x][y]^(p-f[x][y]&1)) << "\n";
else cout<<g[x][y]<<"\n";
}
return 0;
}