HDU 2612 Find a way
生活随笔
收集整理的這篇文章主要介紹了
HDU 2612 Find a way
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
//2612 Find a way
//題意:給一幅圖,有墻,有KFC,有路。兩個人要去KFC約會,有很多個KFC,問兩個人去一間KFC總共走的最少步數
//廣搜水題,居然被初始化卡了兩個鐘悲劇了。。。對兩個人進行BFS,相加步數即可,在網上看到不少人單獨寫了兩個BFS,用兩個單獨的二維數組去存步數,可以是可以,但是如果真正理解BFS的話,一個BFS一個二維數組就可以了,沒有分開的必要,又節約了50行代碼量和200*200*4個字節的空間,O(∩_∩)O~
#include<iostream>
#include<queue>
#define MAXN 0x3fffffff;
using namespace std;int n, m;
char map[210][210];
int cnt[210][210];
int cnt2[210][210];
int visited[210][210];
int vec[4][2]={{0,1},{-1,0},{1,0},{0,-1}};struct node
{int x;int y;int step;bool check(){if (x>=0 && x<n && y>=0 && y<m)return true;return false;}
}Y, M;void BFS(node start, int num)
{memset(visited, 0, sizeof(visited));queue<node> Q;Q.push(start);visited[start.x][start.y] = true;while(!Q.empty()){node q = Q.front();Q.pop();for (int i = 0; i<4; i++){node p = q;p.x = q.x + vec[i][0];p.y = q.y + vec[i][1];p.step ++;if (p.check() && map[p.x][p.y] != '#' && !visited[p.x][p.y]){visited[p.x][p.y] = true;Q.push(p);if (map[p.x][p.y] == '@'){//BFS精粹if (num == 1)cnt[p.x][p.y] = p.step;//第一次elsecnt[p.x][p.y] += p.step;//第二次}}}}
}int main()
{while (cin>>n>>m){for (int i = 0; i<n; i++){for (int j = 0; j<m; j++){cin>>map[i][j];if (map[i][j] == 'Y'){Y.x = i;Y.y = j;Y.step = 0;}if (map[i][j] == 'M'){M.x = i;M.y = j;M.step = 0;}}}for (i = 0; i<n; i++)for (int j = 0; j<m; j++)cnt[i][j] = cnt2[i][j] = MAXN;BFS(Y, 1);BFS(M, 2);int min = MAXN;for (i = 0; i<n; i++){for (int j = 0; j<m; j++){if (map[i][j] == '@' && (cnt[i][j] < min))min = cnt[i][j];}}cout<<min * 11<<endl;}return 0;
}
轉載于:https://www.cnblogs.com/pangblog/p/3278124.html
總結
以上是生活随笔為你收集整理的HDU 2612 Find a way的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第0001课
- 下一篇: Oracle中DUMP转储方法