正题
题目大意
一个n∗mn*mn∗m的雪地,有两种动物RRR和FFF会在雪地上留下RRR和FFF的脚印(只可以走到相邻格子,从(1,1)(1,1)(1,1)进入(n,m)(n,m)(n,m)出来,且会覆盖掉原先的脚印)。
求至少有多少只动物经过
解题思路
首先我们知道(1,1)(1,1)(1,1)所在的联通块必定是最后一只经过的动物,因为至少所以我们优先选择整个联通块作为最后一只动物。
然后由这个联通块开始向外扩展另一种脚印的联通块,之后不停扩展直到扩完为止。
codecodecode
#pragma GCC optimize(2)
%:pragma GCC optimize(3)
%:pragma GCC optimize("Ofast")
%:pragma GCC optimize("inline")
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
const int N=4001;
const int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
int n,m,ans,v[N][N];
int qx[N*N],qy[N*N],l=1,r;
char c[N][N],z;
queue<int> shix,shiy;
inline long long read()
{char c;int f=0,d=1;while(c=getchar(),!isdigit(c)) if(c=='-') d=-1;f=(f<<3)+(f<<1)+c-48;while(c=getchar(),isdigit(c)) f=(f<<3)+(f<<1)+c-48;return d*f;
}
void bfs(int x,int y,char pos)
{shix.push(x);shiy.push(y);while(!shix.empty()){x=shix.front();y=shiy.front();shix.pop();shiy.pop();for(int k=0;k<4;k++){int zx=x+dx[k],zy=y+dy[k];if(zx<1||zy<1||zx>n||zy>m)continue;if(v[zx][zy]||c[zx][zy]!=pos)continue;v[zx][zy]=1;shix.push(zx);shiy.push(zy);qx[++r]=zx;qy[r]=zy;}}
}
int main()
{freopen("data.txt","r",stdin);n=read();m=read();for(int i=1;i<=n;i++)gets(c[i]+1);v[1][1]=qx[++r]=qy[r]=1;bfs(1,1,c[1][1]);z=c[1][1];while(l<=r){ans++;int R=r;if(z=='F') z='R';else z='F';for(int i=l;i<=R;i++)bfs(qx[i],qy[i],z);l=R+1;}cout<<ans;
}