这道题我们需要记录这个点是否走过已经,已经走过的点只要走过的次数不一样就可以再走
就是同一个点在不同的步数到达是可以重复走的,需要用到三维数组来记录状态
bfs算法,代码如下
#include<iostream>
#include<queue>
using namespace std;
struct p
{
int x,y,cot,d;
};
char g[1010][1010];
bool st[1010][1010][12];
int vp[4][2]={0,1,0,-1,1,0,-1,0};
int n,m,k,ans=-1;
void bfs(int k)
{
queue<p> q;
q.push({0,0,1,0});
st[0][0][1]=true;
while(!q.empty())
{
auto top=q.front();
q.pop();
int x=top.x,y=top.y,cot=top.cot,dis=top.d;
if(x==n-1&&y==m-1)//到达了终点停止循环
{
ans=dis;
break;
}
for(int i=0;i<4;i++)
{
int xx=x+vp[i][0],yy=y+vp[i][1];
if(xx>=0&&xx<n&&yy>=0&&yy<m)
{
if(cot==k)//该换字母了
{
if(g[xx][yy]==g[x][y]||st[xx][yy][1]) continue;//如果字母相同,或者这个点已经作为过开始点,那么跳过
st[xx][yy][1]=true;//因为如果已经作为过开始点,那么再重新走一次距离肯定会大于等于现在的路径
q.push({xx,yy,1,dis+1});
}
else if(g[xx][yy]==g[x][y])
{
if(st[xx][yy][cot+1]) continue;//如果这个点在当前次数已经走过,跳过
st[xx][yy][cot+1]=true;//走过的点只要次数不一致就可以再走
q.push({xx,yy,cot+1,dis+1});
}
}
}
}
}
int main()
{
cin>>n>>m>>k;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>g[i][j];
bfs(k);
cout<<ans<<endl;
return 0;
}
请问一下 $st数组的第三维表示什么呀$
一个点不止可以走一次,只要你是在不同的步数走到相同点这个点就可以再走
懂啦,谢谢~
点赞,支持~