zoukankan      html  css  js  c++  java
  • 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
    ", mini * ans);
    76     }
    77     return 0;
    78 }
    View Code
  • 相关阅读:
    C++中迭代器失效的问题
    怎么转载别人的博客
    Linux下模拟实现shell
    Linux下的文件描述符与文件指针及其区别
    智能指针
    C++模板(下)
    C++中的模板(上)
    僵尸进程和孤儿进程
    Linux下的atexit函数
    多线程练习
  • 原文地址:https://www.cnblogs.com/bianjunting/p/10476538.html
Copyright © 2011-2022 走看看