题目链接:hdu1072
需要注意的是重置点只能走一次
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#define MAXN 10
using namespace std;
int map[MAXN][MAXN];
int d[4][2] = { {-1,0},{0,-1},{1,0},{0,1} };
int n,m,begin_x,begin_y,end_x,end_y,flag;
struct node
{
int x,y;
int step;
int time;
friend bool operator < (node a,node b)
{
return a.step > b.step;
}
};
void bfs()
{
priority_queue <node> q;
node s,temp;
s.x = begin_x;
s.y = begin_y;
s.step = 0;
s.time = 6;
map[s.x][s.y] = 1;
q.push(s);
while(!q.empty())
{
temp = q.top();
q.pop();
if(temp.x == end_x && temp.y == end_y && temp.time > 0)
{
printf("%d\n",temp.step);
flag = 1;
return;
}
for(int i = 0 ; i < 4 ; i ++)
{
s = temp;
s.x += d[i][0];
s.y += d[i][1];
if(s.x < 0 || s.x >= n || s.y < 0 || s.y >= m || map[s.x][s.y] == 0)
continue;
if(s.time <= 1) continue;
if(map[s.x][s.y] == 4 )
{
s.time = 6;
map[s.x][s.y] = 0;
}
else if(map[s.x][s.y] == 1)
s.time --;
s.step ++;
q.push(s);
}
}
}
int main()
{
int i,j,T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(i = 0 ; i < n ; i ++)
for(j = 0 ; j < m ; j ++)
{
scanf("%d",&map[i][j]);
if(map[i][j] == 2)
{
begin_x = i;
begin_y = j;
}
else if(map[i][j] == 3)
{
end_x = i;
end_y = j;
}
}
flag = 0;
bfs();
if(!flag) printf("-1\n");
}
return 0;
}