bfs判断visited最好还是在入栈之前,这道题的就算visited==true,但如果走过的’1‘数量比较少的话,还是可以继续入栈的
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <iostream>
using namespace std;
#define DEBUG
const int maxn=20+5,maxv=26;
int m,n,k;
int buf[maxn][maxn],visited[maxn][maxn],kk[maxn][maxn];
int mx[4]={0,1,0,-1};
int my[4]={1,0,-1,0};
struct node
{
int x,y,k,step;
}q[500];
bool bfs(){
int f=0,t=0;
q[0].x=q[0].y=q[0].k=q[0].step=0;
while(t>=f){
int tx,ty,tk,tstep;
tx=q[f].x;
ty=q[f].y;
tstep=q[f].step;
tk=q[f++].k;
// visited[tx][ty]=1;
// printf("%d %d %d\n",tx,ty,tk);
// if(tx==m-1&&ty==n-1){cout<<tstep<<"\n";return true;}
for(int i=0;i<4;i++){
int nx=tx+mx[i];
int ny=ty+my[i];
int nk=0;
if(nx==m-1&&ny==n-1){cout<<tstep+1<<"\n";return true;}
if(nx<0||nx>=m||ny<0||ny>=n)continue;
if(buf[nx][ny]==1)nk=tk+1;
if(nk>k)continue;
if(visited[nx][ny]){
if(kk[nx][ny]>nk)
kk[nx][ny]=nk;
else continue;
}
else kk[nx][ny]=nk;
// printf("?????????%d %d\n",f,t);
t++;
visited[nx][ny]=1;
q[t].x=nx;q[t].y=ny;q[t].k=nk;q[t].step=tstep+1;
}
}
return false;
}
int main(){
#ifdef DEBUG
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
int t;
cin>>t;
while(t--){
memset(visited,0,sizeof(visited));
cin>>m>>n>>k;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)cin>>buf[i][j];
// for(int i=0;i<m;i++)
// {for(int j=0;j<n;j++)cout<<buf[i][j]<<" ";cout<<"\n";}
if(m==1&&n==1)
{cout<<0<<endl;continue;}
if(!bfs())
cout<<-1<<endl;
// cout<<"\n";
}
#ifdef DEBUG
fclose(stdin);
fclose(stdout);
#endif
return 0;
}