HDU 2612 Find a way
生活随笔
收集整理的這篇文章主要介紹了
HDU 2612 Find a way
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
//2612 Find a way
//題意:給一幅圖,有墻,有KFC,有路。兩個(gè)人要去KFC約會(huì),有很多個(gè)KFC,問(wèn)兩個(gè)人去一間KFC總共走的最少步數(shù)
//廣搜水題,居然被初始化卡了兩個(gè)鐘悲劇了。。。對(duì)兩個(gè)人進(jìn)行BFS,相加步數(shù)即可,在網(wǎng)上看到不少人單獨(dú)寫(xiě)了兩個(gè)BFS,用兩個(gè)單獨(dú)的二維數(shù)組去存步數(shù),可以是可以,但是如果真正理解BFS的話,一個(gè)BFS一個(gè)二維數(shù)組就可以了,沒(méi)有分開(kāi)的必要,又節(jié)約了50行代碼量和200*200*4個(gè)字節(jié)的空間,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;
}
轉(zhuǎn)載于:https://www.cnblogs.com/pangblog/p/3278124.html
總結(jié)
以上是生活随笔為你收集整理的HDU 2612 Find a way的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 第0001课
- 下一篇: Oracle中DUMP转储方法