BFS最短路,注意剪枝
死活RE,留坑
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int dir[8]={0,-1,-1,0,0,1,1,0};
struct pos{
int row;
int col;
int t;
int ct;
pos(int ro,int co,int k,int cont):row(ro),col(co),t(k),ct(cont){};
};
queue<pos> q;
int chess[30][30],vis[30][30];
int r,c,k,ans;
bool init(){
memset(chess,0,sizeof(chess));
memset(vis,0,sizeof(vis));
while(!q.empty()) q.pop();
scanf("%d %d",&r,&c);
scanf("%d",&k);
ans=0;
for(int i = 1; i<=r;i++){
for(int j=1;j<=c;j++)
{
scanf("%d",&chess[i][j]);
}
}
}
bool bfs(){
while(!q.empty()){
pos u=q.front();
q.pop();
vis[u.row][u.col]=1;
if(u.col==c&&u.row==r){
ans=u.ct;
return true;
}
for(int i=0;i<8;i+=2){
int tarc=u.col+dir[i+1];
int tarr=u.row+dir[i];
if(tarc>c||tarc<1||tarr>r||tarr<1){
continue;
}
else {
if(vis[tarr][tarc]) continue;
else if(chess[tarr][tarc]){
if(u.t==0)
continue;
else{
// printf("%d %d %d\n",tarr,tarc,vis[tarr][tarc]);
q.push(pos(tarr,tarc,u.t-1,u.ct+1));
}
}
else{
// printf("%d %d %d\n",tarr,tarc,vis[tarr][tarc]);
q.push( pos(tarr,tarc,k,u.ct+1));
}
}
}
}
return false;
}
int main(void){
int n;
scanf("%d",&n);
while(n--){
init();
q.push(pos(1,1,k,1));
if(!bfs()){
printf("-1\n");
}
else{
printf("%d\n",ans-1);
}
}
return 0;
}