hdu 4198 杭电系列赛(四) BFS + 优先队列

来源:互联网 发布:java调用esb 服务方式 编辑:程序博客网 时间:2024/05/16 03:16

题意:给出一个矩阵h*w,起始点是"S","#"不能走,且矩阵四周用#围起来,边界不是"#"的地方代表出口,遇到“.”的话时间加一,遇到“@”的话时间加(d+1),求从起点离开这个矩阵的最小时间。

思路:普通的BFS不可破,应该用优先队列的BFS,由于出口不唯一吧,所以要写好BFS的出口条件!

//bool operator < (const point &a) const {
        if (tim > a.tim) return 1;           //时间大的话 则是"小",那么后出队列 
        return 0;
        //return a.tim > b.tim;
            
    }    

这样重载小于号 貌似比友元的那种要快

#include<iostream>#include<cstdio>#include<queue>using namespace std;struct point {    int x , y;    int tim;    friend bool operator < (point a , point b) {        if (a.tim > b.tim) return 1;           //时间大的话 则是"小",那么后出队列         return 0;        //return a.tim > b.tim;                }    };int dir[4][2]={{-1,0},{1,0},{0,1},{0,-1}};char map[1010][1010];int vis[1010][1010];int h , w , d;int sx , sy , ex , ey;priority_queue<point> Q;int bfs() {    point node , start;    start.x = sx;    start.y = sy;    start.tim = 1;    vis[sx][sy] = 1;    while(!Q.empty()) Q.pop();    Q.push(start);    while(!Q.empty()) {        start = Q.top();        //printf("%d %d\n",start.x,start.y);        Q.pop();        for(int k = 0 ; k < 4 ; k ++) {            int xx , yy;            xx = start.x + dir[k][0];            yy = start.y + dir[k][1];            if (xx<0||xx>=h||yy<0||yy>=w) return start.tim;//因为出口不止一个吧,所以这样搞             if(!vis[xx][yy]&&map[xx][yy]!='#'&&xx>=0&&xx<h&&yy>=0&&yy<w) {                vis[xx][yy] = 1;                if (map[xx][yy] == '.')                node.tim = start.tim + 1;                if (map[xx][yy] == '@')                node.tim = start.tim + d + 1;                node.x = xx;                node.y = yy;                //if(xx==0||xx==(h-1)||yy==0||yy==(w-1)) return node.tim; 单出口可以这样                 Q.push(node);                }           }            }    return -1;                    }int main() {    int N , i , j;    scanf("%d",&N);    while (N--) {        scanf("%d%d%d",&h,&w,&d);         memset(vis,0,sizeof(vis));        for (i = 0 ; i < h ; i ++)            for(j = 0 ; j < w ; j ++) {                cin>>map[i][j];                if(map[i][j]=='S'){                    sx = i;                    sy = j;                    }              }             int ans = bfs();            printf("%d\n",ans);      }    return 0;    }


原创粉丝点击