• hdu 1242 Rescue BFS+优先队列


    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1242

    题意:"r"是起点,"a"是终点,'.'是路,'x'是守卫,'#'是不能走的地方。杀掉守卫要多花1个单位时间,每次上下左右移动要花一个单位时间。问到终点花的最少时间。

    思路:这种N*M的地图且带权(一个是1,一个是2)的一般使用BFS+优先队列,如果不带权可以直接使用BFS。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int N, M;
     4 #define maxn 210
     5 #define inf 0x3f3f3f3f
     6 char mp[maxn][maxn];
     7 int sx, sy, ex, ey;
     8 int dir[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
     9 struct Node
    10 {
    11     int x, y, d;
    12     Node(int xx, int yy, int dd)
    13     {
    14         x = xx; y = yy; d = dd;
    15     }
    16     Node(){}
    17     friend bool operator <(Node a, Node b)
    18     {
    19         return a.d > b.d;
    20     }
    21 };
    22 int dist[maxn][maxn];
    23 int bfs()
    24 {
    25     memset(dist, inf, sizeof(dist));
    26     priority_queue <Node> q;
    27     dist[sx][sy] = 0;
    28     q.push(Node(sx, sy, 0));
    29     while(!q.empty())
    30     {
    31         Node u = q.top(); q.pop();
    32         for(int i = 0; i < 4; i++)
    33         {
    34             int xx = u.x + dir[i][0];
    35             int yy = u.y + dir[i][1];
    36            //cout<<xx<<" "<<yy<<endl;
    37             if(xx < 0 || xx >= N || yy < 0 || yy >= M || mp[xx][yy] == '#') continue;
    38             if(mp[xx][yy] == 'a') return u.d+1;
    39             
    40             Node temp = Node(xx, yy, u.d);
    41             temp.d++;
    42             if(mp[xx][yy] == 'x') temp.d++;
    43             if(dist[xx][yy] >= temp.d) 
    44             {
    45                 q.push(temp);
    46                 dist[xx][yy] = temp.d;
    47             }
    48         }
    49     }
    50     return -1;
    51     
    52 }
    53 int main() 
    54 {
    55     //freopen("in.txt", "r", stdin);
    56     //freopen("out.txt", "w", stdout);
    57     while(~scanf("%d%d", &N, &M))
    58     {
    59         for(int i = 0; i < N; i++)
    60         {
    61             scanf("%s", mp[i]);
    62         }
    63         for(int i = 0; i < N; i++)
    64         {
    65             for(int j = 0; j < M; j++)
    66             {
    67                 if(mp[i][j] == 'r'){sx = i; sy = j;}
    68                 if(mp[i][j] == 'a'){ex = i; ey = j;}
    69             }
    70         }
    71         int ans = bfs();
    72         if(ans == -1) printf("Poor ANGEL has to stay in the prison all his life.
    ");
    73         else printf("%d
    ", ans);
    74     }
    75     return 0;
    76 }
  • 相关阅读:
    读 Kafka 源码写优雅业务代码:配置类
    如何安装FTP服务器,并实现文件共享
    Merge into用法总结
    Insomnia 跟 Postman 类似的软件
    iOS dealloc中初始化weak指针崩溃防护
    Centos7安装febootstrap
    获取 linux 系统 CPU、内存、磁盘 IO 等信息的脚本
    Git本地远程仓库
    网络及服务故障的排查思路
    Git配置远程仓库(密匙链接)
  • 原文地址:https://www.cnblogs.com/titicia/p/5359116.html
Copyright © 2020-2023  润新知