zoukankan      html  css  js  c++  java
  • HDU2612 find a way

    题目链接:Find a way

    bfs水题。

      1 /*
      2   只有两个人啊。分别以两个人为起点bfs,计算出每个人到每个KFC 的时间。两个人都能到达的KFC的较大时间的最小值、就是ans。好水。T_T
      3  */
      4 
      5 #include <stdio.h>
      6 #include <string.h>
      7 #include <iostream>
      8 #include <string>
      9 #include <queue>
     10 #define maxn 1000000
     11 using namespace std;
     12 
     13 char mp[210][210];
     14 int vis[210][210];
     15 int step[210][210], step1[210][210], step2[210][210];
     16 int n, m;
     17 
     18 struct Node{
     19     int x, y;
     20 }now, temp, a, b;
     21 
     22 queue<Node>que;
     23 
     24 int dir[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};
     25 
     26 bool check(Node a) {
     27     if (a.x >= 0 && a.x < n && a.y >= 0 && a.y < m && !vis[temp.x][temp.y] && mp[temp.x][temp.y] != '#')
     28         return true;
     29     return false;
     30 }
     31 
     32 void bfs1(Node t) {
     33     while(!que.empty()) {
     34         que.pop();
     35     }
     36     memset(vis, 0, sizeof(vis));
     37     que.push(t);
     38     vis[t.x][t.y] = 1;
     39     step1[t.x][t.y] = 0;
     40 
     41     while(!que.empty()) {
     42         now = que.front();
     43         que.pop();
     44         for (int i=0; i<4; ++i) {
     45             temp.x = now.x + dir[i][0];
     46             temp.y = now.y + dir[i][1];
     47             if (check(temp)) {
     48                 vis[temp.x][temp.y] = 1;
     49                 step1[temp.x][temp.y] = step1[now.x][now.y] + 1;
     50                 que.push(temp);
     51             }
     52         }
     53     }
     54 }
     55 
     56 void bfs2(Node t) {
     57      while(!que.empty()) {
     58         que.pop();
     59     }
     60     memset(vis, 0, sizeof(vis));
     61     que.push(t);
     62     vis[t.x][t.y] = 1;
     63     step2[t.x][t.y] = 0;
     64 
     65     while(!que.empty()) {
     66         now = que.front();
     67         que.pop();
     68         for (int i=0; i<4; ++i) {
     69             temp.x = now.x + dir[i][0];
     70             temp.y = now.y + dir[i][1];
     71             if (check(temp)) {
     72                 vis[temp.x][temp.y] = 1;
     73                 step2[temp.x][temp.y] = step2[now.x][now.y] + 1;
     74                 que.push(temp);
     75             }
     76         }
     77     }
     78 }
     79 
     80 int main() {
     81     while(cin >> n >> m) {
     82         memset(vis, 0, sizeof(vis));
     83         for (int i=0; i<n; ++i) {
     84             for (int j=0; j<m; ++j) {
     85                 step[i][j] = maxn;
     86                 step1[i][j] = maxn;
     87                 step2[i][j] = maxn;
     88             }
     89         }
     90         for (int i=0; i<n; ++i) {
     91             for (int j=0; j<m; ++j) {
     92                 cin >> mp[i][j];
     93                 if (mp[i][j] == 'M') {
     94                     a.x = i, a.y = j;
     95                 }
     96                 else if (mp[i][j] == 'Y') {
     97                     b.x = i, b.y = j;
     98                 }
     99             }
    100         }
    101 
    102         bfs1(a);
    103         bfs2(b);
    104         int ans = maxn;
    105         for (int i=0; i<n; ++i) {
    106             for (int j=0; j<m; ++j) {
    107                 if (mp[i][j] == '@') {
    108                     step[i][j] = step1[i][j] + step2[i][j];
    109                 }
    110                 ans = min(ans, step[i][j]);
    111             }
    112         }
    113         cout << ans*11 << endl;
    114     }
    115     return 0;
    116 }
    View Code
  • 相关阅读:
    文本效果
    C# 将数据导出到Execl汇总[转帖]
    using方法的使用
    存储过程的相关记录
    Dictionary 泛型字典集合[转帖]
    JS验证
    浅谈AutoResetEvent的用法 [转帖]
    聊聊xp和scrum在实战中的应用问题
    字体下载
    [转] 前端开发工程师如何在2013年里提升自己
  • 原文地址:https://www.cnblogs.com/icode-girl/p/5170117.html
Copyright © 2011-2022 走看看