因为0<=n,m<=8的,所以广搜是没有问题的,题目规定每个点可以重复走,只需要将数值为4的点标记就可以了.
#include
#include
#include
#include
const int maxn = 10;
using namespace std;
struct node{
int x,y;
int time;
int ans;
};
int dir[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
int map[maxn][maxn];
int vis[maxn][maxn];
int x1,y1;
int row,col;
int dfs(){
queue que;
node t;
memset(vis,false,sizeof(vis));
t.time = 6;
t.ans = 0;
t.x = x1 , t.y = y1;
que.push(t);
while(!que.empty()){
t = que.front();
que.pop();
node temp = t;
if(map[temp.x][temp.y] == 3 && temp.time > 0)
return temp.ans;
for(int i = 0; i < 4; ++i){
temp.x = t.x + dir[i][0];
temp.y = t.y + dir[i][1];
temp.time = t.time - 1;
if(temp.x>0 && temp.x<=row && temp.y>0 && temp.y<=col && map[temp.x][temp.y] && !vis[temp.x][temp.y] && temp.time){
temp.ans = t.ans + 1;
if(map[temp.x][temp.y] == 4 ){
temp.time = 6;
vis[temp.x][temp.y] = true;
}
que.push(temp);
}
}
}
return -1;
}
int main()
{
int cas;
scanf("%d",&cas);
while(cas--){
scanf("%d %d",&row,&col);
for(int i = 1; i <= row; ++i)
for(int j = 1; j <= col; ++j){
scanf("%d",&map[i][j]);
if(map[i][j] == 2)
x1 = i , y1 = j;
}
int ans;
if((ans = dfs()) != -1)
printf("%d\n",ans);
else
printf("-1\n");
}
return 0;
}