HDU-2612.Find way .(不同起点不同终点的BFS)
我要被这个好用的memset气死了......
真香
#include <cstring> #include <string>
int main () { string a[10]; memset(a, "真香", sizeof(a)); }
这道题也是出现了和昨天一样的情况,半小时写完,改bug改了1个小时,结果最后啸神说memeset不能随便给大数赋值,结果一改就改对了emm,真的是要被自己菜死了。
本题大意:给定一张地图,Y和M同时走向附近的KFC,找出Y和M距离和最短的KFC并输出他们所用时间的和。
本题思路:从Y,M开始BFS,记录他们到所有KFC的距离,选择最小的输出即可。
本题代码:
1 #include <cstdio> 2 #include <queue> 3 #include <cmath> 4 #include <cstring> 5 #include <vector> 6 using namespace std; 7 8 typedef pair<int , int > P; 9 const int mini = 11, maxn = 200 + 5, INF = 0x3f3f3f3f; 10 int n, m, ans; 11 char maze[maxn][maxn]; 12 int disy[maxn][maxn], dism[maxn][maxn];//存储Y和M到KFC的距离 13 bool flag;//作用为判断当前进行BFS的是Y还是M 14 15 void bfs(int u, int v) { 16 queue <P> s; 17 s.push(make_pair(u, v)); 18 while(!s.empty()) { 19 P p = s.front(); 20 s.pop(); 21 for(int dx = -1; dx <= 1; dx ++) { 22 for(int dy = -1; dy <= 1; dy ++) { 23 if(abs(dx) != abs(dy)) { 24 int nx = p.first + dx, ny = p.second + dy; 25 if(nx >= 0 && nx < n && ny >= 0 && ny < m && maze[nx][ny] != '#') { 26 if(!flag) { 27 if(disy[nx][ny] == INF) { 28 s.push(make_pair(nx, ny)); 29 disy[nx][ny] = disy[p.first][p.second] + 1; 30 } 31 } else { 32 if(dism[nx][ny] == INF) { 33 s.push(make_pair(nx, ny)); 34 dism[nx][ny] = dism[p.first][p.second] + 1; 35 } 36 } 37 } 38 } 39 } 40 } 41 } 42 } 43 44 int main () { 45 while(scanf("%d %d", &n, &m) == 2) { 46 ans = INF; 47 flag = false; 48 memset(disy, INF, sizeof(disy));//一般情况下memset别给除0, -1以外的其它值赋值,INF取0x3f3f3f3f时可以用memset赋值 49 memset(dism, INF, sizeof(dism)); 50 vector <P> kfc; 51 P Y, M; 52 getchar(); 53 for(int i = 0; i < n; i ++) { 54 for(int j = 0; j < m; j ++) { 55 maze[i][j] = getchar(); 56 if(maze[i][j] == '@') 57 kfc.push_back(make_pair(i, j)); 58 if(maze[i][j] == 'Y') 59 Y = make_pair(i, j); 60 if(maze[i][j] == 'M') 61 M = make_pair(i, j); 62 } 63 getchar(); 64 } 65 disy[Y.first][Y.second] = 0; 66 dism[M.first][M.second] = 0; 67 bfs(Y.first, Y.second); 68 flag = true; 69 bfs(M.first, M.second); 70 for(vector <P> :: iterator i = kfc.begin(); i != kfc.end(); i ++) { 71 disy[i -> first][i -> second] += dism[i -> first][i -> second]; 72 if(disy[i -> first][i -> second] < ans && disy[i -> first][i -> second] > 0) 73 ans = disy[i -> first][i -> second]; 74 } 75 printf("%d\n", mini * ans); 76 } 77 return 0; 78 }
时间并不会因为你的迷茫和迟疑而停留,就在你看这篇文章的同时,不知道有多少人在冥思苦想,在为算法废寝忘食,不知道有多少人在狂热地拍着代码,不知道又有多少提交一遍又一遍地刷新着OJ的status页面……
没有谁生来就是神牛,而千里之行,始于足下!