BFS with status
A number (KS) is used to indicate the State-the number of obstacles for the current continuous traversal;
Step indicates the number of current steps;
The visit array also adds a State;
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <queue> 5 using namespace std; 6 7 const int maxn = 30 ; 8 9 struct node {10 int x,y;11 int step;12 int ks;13 void init (int nx,int ny,int nstep,int nks){14 x=nx;y=ny;step=nstep;ks=nks;15 }16 };17 18 int n,m,k;19 int map[maxn][maxn],visit[maxn][maxn][maxn];20 int dir[4][2]={1,0,-1,0,0,1,0,-1};21 22 int bfs (){23 queue<node> q;24 while (!q.empty ())25 q.pop ();26 node a,b;27 a.init (1,1,0,0);28 q.push (a);29 while (!q.empty ()){30 a=q.front ();31 q.pop ();32 33 int xx,yy,sstep,kss;34 for (int i=0;i<4;i++){35 xx=a.x;yy=a.y;sstep=a.step;kss=a.ks;36 xx+=dir[i][0];37 yy+=dir[i][1];38 sstep+=1;39 if (xx<1||xx>n||yy<1||yy>m)40 continue ;41 if (map[xx][yy])42 kss++;43 else kss=0;44 if (kss>k)45 continue ;46 if (visit[kss][xx][yy])47 continue ;48 if (xx==n&&yy==m)49 return sstep ;50 b.init (xx,yy,sstep,kss);51 q.push (b);52 visit[kss][xx][yy]=1;53 }54 }55 return -1;56 }57 58 int main (){59 int t;60 cin>>t;61 while (t--){62 cin>>n>>m>>k;63 if (n==m&&n==1){64 cout<<0<<"error"<<endl;65 continue ;66 }67 memset (visit,0,sizeof visit);68 for (int i=1;i<=n;i++)69 for (int j=1;j<=m;j++)70 cin>>map[i][j];71 int ans=bfs ();72 cout<<ans<<endl;73 }74 return 0;75 }