题目
解题思路
显然只要有两种以上的动物,就会将原足迹分割成不同的部分,可以bfs出不同部分的数量。
注意可能会因为读入而导致
t
l
e
tle
tle,建议用
g
e
t
c
h
a
r
getchar
getchar。
最后可能会因为用了
s
t
l
stl
stl而导致超时,建议模拟队列(吸氧气)
代码
#pragma GCC optimize("O2")
#pragma GCC optimize("O3")
#include<queue>
#include<cstdio>
#define rep(i,x,y) for(register int i=x;i<=y;i++)
using namespace std;
const int N=4002;
const int dx[4]={0,0,-1,1};
const int dy[4]={-1,1,0,0};
int n,m,ans=1; char c[N][N]; bool vis[N][N];
queue<pair<int,int> >q[2];
bool bfs(int k){
int b=0;
while (q[k].size()){
int x=q[k].front().first,y=q[k].front().second; q[k].pop();
rep(i,0,3) {
int xx=x+dx[i],yy=y+dy[i];
if (xx<1||yy<1||xx>n||yy>m||vis[xx][yy]||c[xx][yy]=='.') continue;
if (c[xx][yy]==c[x][y]) q[k].push(make_pair(xx,yy)); else
q[k^1].push(make_pair(xx,yy)),b=1;
vis[xx][yy]=1;
}
}
return b;
}
int main(){
scanf("%d%d",&n,&m);
rep(i,1,n) rep(j,1,m) while (c[i][j]=getchar())
if (c[i][j]=='.'||c[i][j]=='F'||c[i][j]=='R') break;
vis[1][1]=1; q[0].push(make_pair(1,1));
for (int i=0;;i^=1,ans++) if (!bfs(i)) break;
return 0&printf("%d",ans);
}