rt,过不了样例中的第四组数据
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<cassert>
#include<stack>
#include<queue>
#include<vector>
#include<map>
#include<cstdlib>
#include<set>
using namespace std;
#define ll long long
#define ull unsigned long long
int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0' || ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0' && ch<='9')
{
x=x*10+(ch-'0');
ch=getchar();
}
return x*f;
}
const int MAXN=5010;
int n,m;
char g[MAXN][MAXN];
struct node
{
int x,y,z;
char c;//记录当前位置的字符
};
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
deque<node>q;//用deque进行01bfs
bool vis[MAXN][MAXN];
void bfs()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
vis[i][j]=0;
}
q.clear();
q.push_front((node){1,1,0,g[1][1]});
vis[1][1]=1;
while(!q.empty())
{
node fir=q.front();
q.pop_front();
int x=fir.x,y=fir.y,z=fir.z;
char c=fir.c;
if(x==n && y==m)//若遍历到了终点
{
printf("%d\n",z);
break;
}
for(int i=0;i<4;i++)//遍历相邻位置的四个节点
{
int fx=x+dx[i],fy=y+dy[i];
if(fx<1 || fy<1 || fx>n || fy>m || vis[fx][fy])
continue;
vis[fx][fy]=1;
if(g[fx][fy]==c)
q.push_front((node){fx,fy,z,c});//该点对答案的贡献为0
else
q.push_back((node){fx,fy,z+1,g[fx][fy]});
}
}
}
int main()
{
int t=read();
while(t--)
{
n=read(),m=read();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
cin>>g[i][j];
}
bfs();
}
return 0;
}