POJ 3170(bfs求最短路)
2016-07-28 21:44
447 查看
Knights of Ni
Description
Bessie is in Camelot and has encountered a sticky situation: she needs to pass through the forest that is guarded by the Knights of Ni. In order to pass through safely, the Knights have demanded that she bring them a single shrubbery. Time is of the essence,
and Bessie must find and bring them a shrubbery as quickly as possible.
Bessie has a map of of the forest, which is partitioned into a square grid arrayed in the usual manner, with axes parallel to the X and Y axes. The map is W x H units in size (1 <= W <= 1000; 1 <= H <= 1000).
The map shows where Bessie starts her quest, the single square where the Knights of Ni are, and the locations of all the shrubberies of the land. It also shows which areas of the map can be traverse (some grid blocks are impassable because of swamps, cliffs,
and killer rabbits). Bessie can not pass through the Knights of Ni square without a shrubbery.
In order to make sure that she follows the map correctly, Bessie can only move in four directions: North, East, South, or West (i.e., NOT diagonally). She requires one day to complete a traversal from one grid block to a neighboring grid block.
It is guaranteed that Bessie will be able to obtain a shrubbery and then deliver it to the Knights of Ni. Determine the quickest way for her to do so.
Input
Line 1: Two space-separated integers: W and H.
Lines 2..?: These lines describe the map, row by row. The first line describes the most northwest part of the map; the last line describes the most southeast part of the map. Successive integers in the input describe columns of the map from west to east. Each
new row of a map's description starts on a new input line, and each input line contains no more than 40 space-separated integers. If W <= 40, then each input line describes a complete row of the map. If W > 40, then more than one line is used to describe a
single row, 40 integers on each line except potentially the last one. No input line ever describes elements of more than one row.
The integers that describe the map come from this set:
0: Square through which Bessie can travel
1: Impassable square that Bessie cannot traverse
2: Bessie's starting location
3: Location of the Knights of Ni
4: Location of a shrubbery
Output
Line 1: D, the minimum number of days it will take Bessie to reach a shrubbery and bring it to the Knights of Ni.
Sample Input
Sample Output
Hint
Explanation of the sample:
Width=8, height=4. Bessie starts on the third row, only a few squares away from the Knights.
Bessie can move in this pattern to get a shrubbery for the Knights: N, W, N, S, E, E, N, E, E, S, S. She gets the shrubbery in the northwest corner and then makes her away around the barriers to the east and then south to the Knights.
Source
两次bfs,分别求出2到4的距离和3到4的距离,求两个距离相加的最小值。
USACO 2005 December Silver
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 2070 | Accepted: 890 |
Bessie is in Camelot and has encountered a sticky situation: she needs to pass through the forest that is guarded by the Knights of Ni. In order to pass through safely, the Knights have demanded that she bring them a single shrubbery. Time is of the essence,
and Bessie must find and bring them a shrubbery as quickly as possible.
Bessie has a map of of the forest, which is partitioned into a square grid arrayed in the usual manner, with axes parallel to the X and Y axes. The map is W x H units in size (1 <= W <= 1000; 1 <= H <= 1000).
The map shows where Bessie starts her quest, the single square where the Knights of Ni are, and the locations of all the shrubberies of the land. It also shows which areas of the map can be traverse (some grid blocks are impassable because of swamps, cliffs,
and killer rabbits). Bessie can not pass through the Knights of Ni square without a shrubbery.
In order to make sure that she follows the map correctly, Bessie can only move in four directions: North, East, South, or West (i.e., NOT diagonally). She requires one day to complete a traversal from one grid block to a neighboring grid block.
It is guaranteed that Bessie will be able to obtain a shrubbery and then deliver it to the Knights of Ni. Determine the quickest way for her to do so.
Input
Line 1: Two space-separated integers: W and H.
Lines 2..?: These lines describe the map, row by row. The first line describes the most northwest part of the map; the last line describes the most southeast part of the map. Successive integers in the input describe columns of the map from west to east. Each
new row of a map's description starts on a new input line, and each input line contains no more than 40 space-separated integers. If W <= 40, then each input line describes a complete row of the map. If W > 40, then more than one line is used to describe a
single row, 40 integers on each line except potentially the last one. No input line ever describes elements of more than one row.
The integers that describe the map come from this set:
0: Square through which Bessie can travel
1: Impassable square that Bessie cannot traverse
2: Bessie's starting location
3: Location of the Knights of Ni
4: Location of a shrubbery
Output
Line 1: D, the minimum number of days it will take Bessie to reach a shrubbery and bring it to the Knights of Ni.
Sample Input
8 4 4 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 2 1 1 3 0 4 0 0 0 0 4 1 1 1 0
Sample Output
11
Hint
Explanation of the sample:
Width=8, height=4. Bessie starts on the third row, only a few squares away from the Knights.
Bessie can move in this pattern to get a shrubbery for the Knights: N, W, N, S, E, E, N, E, E, S, S. She gets the shrubbery in the northwest corner and then makes her away around the barriers to the east and then south to the Knights.
Source
两次bfs,分别求出2到4的距离和3到4的距离,求两个距离相加的最小值。
USACO 2005 December Silver
#include<cstdio> #include<cstring> #include<queue> using namespace std; const int maxn = 1e3 + 10; #define INF 0x3f3f3f3f int n, m; int a[maxn][maxn]; int vis[maxn][maxn]; int d1[maxn][maxn]; int d2[maxn][maxn]; int dx[] = {0, 0, 1, -1}; int dy[] = {1, -1, 0, 0}; vector<pair<int, int> > b; void bfs(int x, int y, int tt[][maxn]){ queue<pair<int, int> > q; memset(vis, 0, sizeof vis); q.push(make_pair(x, y)); int cnt = 0; while(!q.empty()){ pair<int, int> t = q.front(); q.pop(); if(a[t.first][t.second] == 4) cnt++; if(cnt == b.size()) return; for(int i = 0; i < 4; i++){ int xx = t.first + dx[i]; int yy = t.second + dy[i]; if(xx < 0 || xx >= n || yy < 0 || yy >= m) continue; if(a[xx][yy] != 1 && !vis[xx][yy]){ vis[xx][yy] = 1; tt[xx][yy] = tt[t.first][t.second] + 1; q.push(make_pair(xx, yy)); } } } } int main(){ int t1, t2, p1, p2; scanf("%d%d", &m, &n); for(int i = 0; i < n; i++) for(int j = 0; j < m; j++){ scanf("%d", &a[i][j]); if(a[i][j] == 3){ t1 = i; t2 = j; } if(a[i][j] == 2){ p1 = i; p2 = j; } if(a[i][j] == 4){ b.push_back(make_pair(i, j)); } } int minn = INF; memset(d1, 0, sizeof d1); memset(d2, 0, sizeof d2); bfs(p1, p2, d1); bfs(t1, t2, d2); for(int i = 0; i < b.size(); i++){ int ss = b[i].first, pp = b[i].second; if(d1[ss][pp] && d2[ss][pp]) minn = min(minn, d1[ss][pp] + d2[ss][pp]); } printf("%d\n", minn); }
相关文章推荐
- NYOJ-68 三点顺序
- Zabbix-3.0.3使用自带模板监控MySQL
- PCM转MP3工具的封装
- Java 泛型的详解
- POJ2424 4th Point
- JAVASCRIPT:STRING类型
- Java SE--集合框架--记录点点滴滴
- android异常收集-java.lang.RuntimeException: Fail to get camera info
- BZOJ1015 [JSOI2008]星球大战starwar
- mysql 易错误理解
- Java异常处理中finally中的return会覆盖catch语句中的return语句
- 将当前界面的可视组件保存在png图像文件中
- 关于 二维码的生成
- 为什么Servlet修改之后,Tomcat都得重启,servlet才会生效!
- python学习之路-day1-python基础1
- Android_Spinner_example
- Zabbix-3.0.3结合Grafana-3.1.0给你想要的绘图
- 如何在C#下生成DLL文件,以及如何在C#下调用生成的DLL文件
- 【poj1019】 Number Sequence
- Java进阶(三十八)快速排序