hdu1072 Nightmare(优先队列,BFS)

来源:互联网 发布:义乌小商品出口数据 编辑:程序博客网 时间:2024/06/07 06:19

题目链接:hdu1072

需要注意的是重置点只能走一次

#include<stdio.h>#include<string.h>#include<algorithm>#include<queue>#define MAXN 10using 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;}


原创粉丝点击