Description
Input
Output
Sample Input
2 6 5 7 ##### #S..# #@#.# #...# #@### #.### 4 5 3 ##### #S#.# #@..# ###@#
Sample Output
16 11
Source
题意:求走出地图的最短时间,‘#‘不能走,‘.‘耗时一,‘@‘耗时K+1
思路:在BFS的基础上加上优先队列
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace std; const int MAXN = 510; struct Point { int x, y, step; bool operator< (Point const &a) const { return step > a.step; } } st, ed; char map[MAXN][MAXN]; int vis[MAXN][MAXN]; int dx[4]={1, -1, 0, 0}; int dy[4]={0, 0, 1, -1}; int n, m, k; void bfs() { memset(vis, 0, sizeof(vis)); priority_queue<Point> q; vis[st.x][st.y] = 1; q.push(st); while (!q.empty()) { Point cur = q.top(); q.pop(); if (cur.x == 0 || cur.x == n-1 || cur.y == 0 || cur.y == m-1) { printf("%d\n", cur.step+1); return; } for (int i = 0; i < 4; i++) { int nx = cur.x + dx[i]; int ny = cur.y + dy[i]; if (vis[nx][ny] || map[nx][ny] == '#') continue; if (nx >= 0 && nx < n && ny >= 0 && ny < m) { vis[nx][ny] = 1; Point tmp; if (map[nx][ny] == '.') { tmp.x = nx, tmp.y = ny; tmp.step = cur.step + 1; } else if (map[nx][ny] == '@') { tmp.x = nx, tmp.y = ny; tmp.step = cur.step + k + 1; } q.push(tmp); } } } } int main() { int t; scanf("%d", &t); while (t--) { scanf("%d%d%d", &n, &m, &k); for (int i = 0; i < n; i++) { scanf("%s", map[i]); for (int j = 0; j < m; j++) { if (map[i][j] == 'S') { map[i][j] = '.'; st.x = i, st.y = j, st.step = 0; } } } bfs(); } return 0; }
HDU - 4198 Quick out of the Harbour (BFS+优先队列),布布扣,bubuko.com
HDU - 4198 Quick out of the Harbour (BFS+优先队列)
原文地址:http://blog.csdn.net/u011345136/article/details/37818095