HDU 2612 Find a way (BFS)


鏈接 : Here!

思路 : 兩遍BFS, 第一次是從 'Y' 搜索, 搜到 '@' 就將其累加到一個數組中, 這裏採用將二維座標點映射成一維的點, 第二次從 'M' 搜索, 搜到 '@' 就將其累加到一個數組中, 最後掃描一遍地圖, 將 $ans$ 更新爲字符爲 '@' 的累加值最小值. 最後答案就是 $ans * 11$


/*************************************************************************
    > File Name: 2612-Find-a-way.cpp
    > Author: 
    > Mail: 
    > Created Time: 2017年11月29日 星期三 20時02分14秒
 ************************************************************************/

#include <bits/stdc++.h>
using namespace std;

#define MAX_N 300
const int INF = 0x3f3f3f;
int n, m;
int cnt[MAX_N * MAX_N] = {0}; // 相當於是個hash表, 將所有二維點映射進去
int vis[MAX_N][MAX_N];
int dx[4] = {0, 0, -1, 1};
int dy[4] = {-1, 1, 0, 0};
char G[MAX_N][MAX_N];
struct Point {
    Point () {}
    Point (int x, int y, int step) : x(x), y(y), step(step) {}
    int x, y, step;
};

bool check(Point pt) {
    return !(pt.x < 0 || pt.x >= n || pt.y < 0 || pt.y >= m || vis[pt.x][pt.y] || (G[pt.x][pt.y] == '#'));
}
void solve(Point st) {
    queue<Point> que;
    que.push(st);
    vis[st.x][st.y] = 1;
    while(!que.empty()) {
        Point now = que.front();
        que.pop();
        for (int i = 0 ; i < 4 ; ++i) {
            Point temp(now.x + dx[i], now.y + dy[i], now.step + 1);
            if (!check(temp)) continue;
            vis[temp.x][temp.y] = 1;
            if (G[temp.x][temp.y] == '@') cnt[temp.x * m + temp.y] += temp.step;
            que.push(temp);
        }
    }
}
int main() {
    Point st, ed;
    while (scanf("%d%d", &n, &m) != EOF) {
        for (int i = 0 ; i < n ; ++i) {
            getchar();
            scanf("%s", G[i]);
            for (int j = 0 ; j < m ; ++j) {
                if (G[i][j] == 'Y') st.x = i, st.y = j, st.step = 0;
                if (G[i][j] == 'M') ed.x = i, ed.y = j, ed.step = 0;
            }
        }
        solve(st);
        memset(vis, 0, sizeof(vis));
        solve(ed);
        memset(vis, 0, sizeof(vis));
        int ans = INF;
        for (int i = 0 ; i < n ; ++i) {
            for (int j = 0 ; j < m ; ++j) {
                if (G[i][j] == '@' && cnt[i * m + j] != 0) {
                    ans = min(ans, cnt[i * m + j]);
                }
            }
        }
        printf("%d\n", ans * 11);
        memset(G, 0, sizeof(G));
        memset(cnt, 0, sizeof(cnt));
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章