炸一看好像很神仙的样子,其实就是个sb题 万年不见的1A
但是我们可以反过来想,先选一个起点到终点的联通块,然后这联通块后面相当于就能够走了,继续找联通块
然后就能发现直接相邻的脚步相同的边权为0,否则边权为1
直接bfs找最深的层就完事了
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; const int _=1e2; const int maxn=4000+_; const int maxm=4000+_; const int maxp=4000*4000+_; const int dx[4]={-1,0,1,0}; const int dy[4]={0,1,0,-1}; int n,m;char mp[maxn][maxm]; int head,tail,d[maxn][maxm]; pair<int,int>list[2*maxp]; void bfs() { int ans=0;d[1][1]=1; head=maxp,tail=maxp;list[tail++]=make_pair(1,1); while(head!=tail) { int x=list[head].first,y=list[head].second;head++; ans=max(ans,d[x][y]); for(int k=0;k<=3;k++) { int tx=x+dx[k],ty=y+dy[k]; if(tx>0&&tx<=n&&ty>0&&ty<=m&&mp[tx][ty]!='.'&&d[tx][ty]==0) { int w=(mp[x][y]==mp[tx][ty])?0:1; d[tx][ty]=d[x][y]+w; if(w==0)list[--head]=make_pair(tx,ty); else list[tail++]=make_pair(tx,ty); } } } printf("%d\n",ans); } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)scanf("%s",mp[i]+1); bfs(); return 0; }