hdu1072 Nightmare(优先队列,BFS)

2014-11-24 02:30:34 · 作者: · 浏览: 2
需要注意的是重置点只能走一次
#include  
#include  
#include  
#include  
#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  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; }