[hdu1242]优先队列

题意:给一个地图,‘x‘走一步代价为2,‘.‘走一步代价为1,求从s到t的最小代价。裸优先队列。

  1 #pragma comment(linker, "/STACK:10240000,10240000")
  2
  3 #include <iostream>
  4 #include <cstdio>
  5 #include <algorithm>
  6 #include <cstdlib>
  7 #include <cstring>
  8 #include <map>
  9 #include <queue>
 10 #include <deque>
 11 #include <cmath>
 12 #include <vector>
 13 #include <ctime>
 14 #include <cctype>
 15 #include <set>
 16
 17 using namespace std;
 18
 19 #define mem0(a) memset(a, 0, sizeof(a))
 20 #define lson l, m, rt << 1
 21 #define rson m + 1, r, rt << 1 | 1
 22 #define define_m int m = (l + r) >> 1
 23 #define Rep(a, b) for(int a = 0; a < b; a++)
 24 #define lowbit(x) ((x) & (-(x)))
 25 #define constructInt4(name, a, b, c, d) name(int a = 0, int b = 0, int c = 0, int d = 0): a(a), b(b), c(c), d(d) {}
 26 #define constructInt3(name, a, b, c) name(int a = 0, int b = 0, int c = 0): a(a), b(b), c(c) {}
 27 #define constructInt2(name, a, b) name(int a = 0, int b = 0): a(a), b(b) {}
 28
 29 typedef double db;
 30 typedef long long LL;
 31 typedef pair<int, int> pii;
 32 typedef multiset<int> msi;
 33 typedef multiset<int>::iterator msii;
 34 typedef set<int> si;
 35 typedef set<int>::iterator sii;
 36 typedef vector<int> vi;
 37
 38 const int dx[8] = {1, 0, -1, 0, 1, 1, -1, -1};
 39 const int dy[8] = {0, -1, 0, 1, -1, 1, 1, -1};
 40 const int maxn = 1e5 + 7;
 41 const int maxm = 1e5 + 7;
 42 const int maxv = 1e7 + 7;
 43 const int MD = 1e9 +7;
 44 const int INF = 1e9 + 7;
 45 const double PI = acos(-1.0);
 46 const double eps = 1e-10;
 47
 48 struct Node {
 49     int x, y, cost;
 50     bool operator < (const Node &a) const {
 51         return cost > a.cost;
 52     }
 53     constructInt3(Node, x, y, cost);
 54 };
 55
 56 priority_queue<Node> Q;
 57
 58 int n, m;
 59 char s[220][220];
 60
 61 void BFS(int x1, int y1, int x2, int y2) {
 62     while (!Q.empty()) Q.pop();
 63     Q.push(Node(x1, y1, 0));
 64     s[x1][y1] = ‘*‘;
 65     while (!Q.empty()) {
 66         Node top = Q.top(); Q.pop();
 67         if (top.x == x2 && top.y == y2) {
 68             cout << top.cost << endl;
 69             return ;
 70         }
 71         for (int i = 0; i < 4; i++) {
 72             int x = top.x + dx[i], y = top.y + dy[i];
 73             if (x >= 0 && x < n && y >= 0 && y < m && (s[x][y] == ‘.‘ || s[x][y] == ‘x‘)) {
 74                 Q.push(Node(x, y, top.cost + (s[x][y] == ‘.‘? 1 : 2)));
 75                 s[x][y] = ‘*‘;
 76             }
 77         }
 78     }
 79     puts("Poor ANGEL has to stay in the prison all his life.");
 80 }
 81
 82 int main() {
 83     //freopen("in.txt", "r", stdin);
 84     while (cin >> n >> m) {
 85         int x1, x2, y1, y2;
 86         for (int i = 0; i < n; i++) {
 87             scanf("%s", s + i);
 88             for (int j = 0; j < m; j++) {
 89                 if (s[i][j] == ‘r‘) {
 90                     x1 = i;
 91                     y1 = j;
 92                     s[i][j] = ‘.‘;
 93                 }
 94                 if (s[i][j] == ‘a‘) {
 95                     x2 = i;
 96                     y2 = j;
 97                     s[i][j] = ‘.‘;
 98                 }
 99             }
100         }
101         BFS(x1, y1, x2, y2);
102     }
103     return 0;
104 }

时间: 2024-10-24 17:36:13

[hdu1242]优先队列的相关文章

hdu1242 优先队列+bfs

Rescue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 22034    Accepted Submission(s): 7843 Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is d

HDU1242 (BFS搜索中使用优先队列)

一道用到优先队列的BFS题目 #include <iostream> #include <string> #include <cstdio> #include <cstring> #include <queue> #define N 201 using namespace std; char maze[N][N]; int a,b,anw; bool visit[N][N]; int dir[4][2]={{0,1},{1,0},{-1,0},{

51nod1428(优先队列)

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1428 题意:中文题诶- 思路:贪心 问最少要多少教室就是求最多有多少个时间段产生了交集咯.我们先用结构体存储区间并将其按照左端点升序排列,若左端点相同则按右端点升序排列. 接下来遍历所有区间,并维护一个优先队列,其中存储区间右端点值.对于当前区间,我们将优先队列中所有比当前区间左端点小的元素删除(因为其所在区间不会与当前区间相交嘛),然后再将当前区间的右端点加

优先队列实现哈弗曼最小权值

建立哈弗曼树要求我们每次都选频率权值最小的点构成节点,即权值小的点在树的深处,权值大的点在树的浅处,根据节点选择的特点,我们可以把节点的值放在优先队列中,包括新形成的节点. 我们先定义优先队列的优先级别. 1 struct cmp 2 { 3 bool operator()(const int &a,const int &b) 4 { 5 return a>b; 6 } 7 };//最小值优先出队 然后就是实现的整个程序. #include<stdio.h> #inclu

NYOJ 284 坦克大战 &amp;&amp; POJ 2312 Battle City (广搜+优先队列)

链接:click here~~ 题意: 描述 Many of us had played the game "Battle city" in our childhood, and some people (like me) even often play it on computer now. What we are discussing is a simple edition of this game. Given a map that consists of empty space

hdu 4006 The kth great number(优先队列)

The kth great number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) Total Submission(s): 6982    Accepted Submission(s): 2837 Problem Description Xiao Ming and Xiao Bao are playing a simple Numbers game. In a roun

优先队列(堆)

一.优先队列的一些简单的实现: 1. 使用一个简单的链表在表头以O(1) 执行插入操作,并遍历该链表以删除最小元,这需要O(N) 的时间. 2. 始终让表保持有序状态:这使得插入代价高昂(O(N)), 而删除代价低廉(O(1)).基于删除最小元的操作从不多于插入操作的事实,因此,前者是更好地想法. 3. 使用二叉查找树,它对这两种操作的平均运行时间是O(logN).尽管插入是随机的,而删除不是,但这个结论还是成立的.由于删除的唯一元素是最小元.反复除去左子树中的节点似乎损害树的平衡,使得右子树加

优先队列比较符重载

#include <iostream> #include <queue> using namespace std; struct Node{ int x, y; friend bool operator<(Node a, Node b){ return a.x > b.x; //x最小的节点在队首 } }; int main(){ priority_queue<Node> PQ; Node temp = {2, 3}; PQ.push(temp); temp

[ACM] hdu 1242 Rescue (BFS+优先队列)

Rescue Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is described as a N * M (N, M <= 200) matrix. There are WALLs, ROADs, and GUARDs in the prison. Angel's friends want to save Angel. Their task is: