BFS做法:用队列。
注意事项:
1.设的结构体只有一个。
2.标记函数在此题中是三维,第三维代表着走过了多少个1.
#include <cstdio>
#include <iostream>
#include <queue>
#include <string>
#include <cstring>
using namespace std;
int m,n,k,ans;
int a[30][30];
int b[30][30][30];
struct sss
{
int shu;
int heng;
int step;
int jishu;
}l;
int shu1[10] ={0,1,-1,0,0};
int heng1[10]={0,0,0,1,-1};
void bfs()
{
queue<sss>ss;
ss.push(sss{1,1,0,0});
while (!ss.empty())
{
l=ss.front();
ss.pop();
if(l.shu==m&&l.heng==n)
{
ans=l.step;
break;
}
if(a[l.shu][l.heng]==0)
{
l.jishu=0;
}
if(b[l.shu][l.heng][l.jishu]==0)
{
b[l.shu][l.heng][l.jishu]=1;
for (int i=1;i<=4;i++)
{
int s=l.shu+shu1[i];
int h=l.heng+heng1[i];
if(s>=1&&h>=1&&s<=m&&h<=n)
{
if(a[s][h]==0&&b[s][h][l.jishu]==0)
{
ss.push(sss{s,h,l.step+1,l.jishu});
}
if(a[s][h]==1&&l.jishu<k&&b[s][h][l.jishu+1]==0)
{
ss.push(sss{s,h,l.step+1,l.jishu+1});
}
}
}
}
}
while (!ss.empty()) ss.pop();
}
int main ()
{
int T;
cin >> T;
for (int I=1;I<=T;I++)
{
cin >> m >> n >> k;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
ans=-1;
for (int i=1;i<=m;i++)
{
for (int j=1;j<=n;j++)
{
cin >> a[i][j];
}
}
bfs();
cout << ans << endl;
}
return 0;
}


京公网安备 11010502036488号