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; }