CF1350E Orac and Game of Life(BFS)
Posted zhanglichen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF1350E Orac and Game of Life(BFS)相关的知识,希望对你有一定的参考价值。
/* * CF1350E * 题意: * 给出一个n*m的01矩阵,q组询问,称一个方格(i,j)是好的,当且仅当至少有一个 * 与(i,j)相邻的方格颜色与(i,j)相同,经过一个回合后,好方格的颜色改变而不好的方格颜色不变。 * 每组询问给出i,j,p,问p回合后方格(i,j)的颜色是什么。 * 题解; * 好方格不会变化,不好的方格会变化,数轮之后好方格也会被染成不好的方格。 * 因为好方格变为不好是逐层传递的,因此可以bfs出每个方格开始变化的时间,然后根据奇偶性判断最后的状态。 */ #include<bits/stdc++.h> using namespace std; const int maxn=1010; typedef long long ll; int X[4]={1,0,-1,0}; int Y[4]={0,1,0,-1}; int a[maxn][maxn]; int t[maxn][maxn]; int n,m,qq; int main () { cin>>n>>m>>qq; for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) { char c; cin>>c; a[i][j]=c-‘0‘; } queue<pair<int,int>> q; for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) for (int k=0;k<4;k++) { int tx=i+X[k]; int ty=j+Y[k]; if (tx<1||tx>n||ty<1||ty>m) continue; if (a[tx][ty]==a[i][j]) { t[i][j]=1; q.push(make_pair(i,j)); break; } } while (!q.empty()) { int i=q.front().first; int j=q.front().second; q.pop(); for (int k=0;k<4;k++) { int tx=i+X[k]; int ty=j+Y[k]; if (tx<1||tx>n||ty<1||ty>m) continue; if (t[tx][ty]) continue; t[tx][ty]=t[i][j]+1; q.push(make_pair(tx,ty)); } } while (qq--) { int i,j; ll p; cin>>i>>j>>p; if (!t[i][j]||p<t[i][j]) printf("%d ",a[i][j]); else { p=p-t[i][j]+1; if (p&1) printf("%d ",!a[i][j]); else printf("%d ",a[i][j]); } } }
以上是关于CF1350E Orac and Game of Life(BFS)的主要内容,如果未能解决你的问题,请参考以下文章
CF-1350 D. Orac and Medians 思维