思想:
因为一个点可能不止走一次,所以说二维的BFS会超时,但如果变成三维的情况,每当第一次走到三维数组的第一次,就是最短的那个结果,将三维的情况和二维BFS一样变成不可搜索的,并且在搜索过程中,可以根据奇偶来划分下一次是走A还是B,第三维代表的是这个点走的A/B是第几个,整个数组存的是多少点的个数,最后减一是因为结果是步数为点数减一
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
const int N = 1010;
int g[N][N];
int dis[N][N][20];
bool st[N][N][20];
int n,m,k;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
bool check(int x,int y){
return x>=0&&y>=0&&x<n&&y<m;
}
int bfs(){
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
for(int p=0;p<k;p++){
dis[i][j][p]=INF;
}
}
}
queue<array<int,3>> q;
q.push({0,0,1});
dis[0][0][1]=1;
st[0][0][1]=true;
while(q.size()){
auto t=q.front();
q.pop();
int xx=t[0];
int yy=t[1];
int c=t[2];
int d=dis[xx][yy][c];
for(int i=0;i<4;i++){
int nx=xx+dx[i];
int ny=yy+dy[i];
int dd=(d/k)%2;
if(check(nx,ny)&&g[nx][ny]==dd&&!st[nx][ny][(d+1)%k]){
st[nx][ny][(d+1)%k]=true;
dis[nx][ny][(d+1)%k]=d+1;
q.push({nx,ny,(d+1)%k});
}
}
}
int cnt=INF;
for(int i=0;i<k;i++){
cnt=min(cnt,dis[n-1][m-1][i]);
}
return cnt;
}
int main()
{
cin >> n >> m >> k;
for(int i=0;i<n;i++){
string s;
cin >> s;
for(int j=0;j<m;j++){
g[i][j]=(s[j]!='A');
}
}
int res=bfs();
if(res!=INF){
cout << res-1;
}
else{
cout << -1;
}
}