Problem -B DBZ的钥匙
分析: ?這個題其實不難,就是在常規(guī)的BFS上多了一個BFS,即兩個BFS而已!使用一個for循環(huán)即可求出來!以前做過很多BFS的題,這道題其實和那些都差不多,就是在數(shù)據(jù)上需要自己做點功夫,將字符串的地圖改變?yōu)檎麛?shù)型的地圖即可!
思路:1.首先輸入地圖,然后設(shè)立兩個int型的起點和終點數(shù)組用來存起點和終點;
? ? ? ? ? ? ? ? ?同時在字符串的地圖中,如果此處可走,在對應(yīng)的整數(shù)型的地圖中標(biāo)記為1,不能走的地方標(biāo)記為0;
? ? ? ? ? ? 2.由于題目要求:如果找不到鑰匙或者或者找到了鑰匙但是不能把鑰匙給DBZ的話,同樣視為不成功,即輸出“DBZ cheat us”;
? ? ? ? ? ? 3.基于第二點,可以設(shè)立一個標(biāo)記,在所寫的for循環(huán)中,只要有一次ans[i]==0,那么表明失敗!
? ? ? ? ? ? 4.這個就看自己的想法了,可以使用數(shù)組寫隊列,也可以使用C++標(biāo)準(zhǔn)模板庫寫隊列,當(dāng)然我覺得后者更簡單咯!
? ? ? ? ? ? 5.剩下的就是細(xì)節(jié)方面了,這個多想想應(yīng)該就沒問題了!
代碼如下:
#include<cstdio> #include<iostream> #include<cstring> #include<queue> using namespace std; char Map[520][520]; int map[520][520]; int n,m,sx[2],sy[2],dx[2],dy[2],ans[2]; int xx[4]= {1,0,-1,0}; int yy[4]= {0,1,0,-1}; bool vis[520][520]; struct node {int x,y,ti; }; bool bfs() {for(int ss=0; ss<2; ss++){memset(vis,false,sizeof(vis));vis[sx[ss]][sy[ss]]=true;queue<node>Q;node now;now.x=sx[ss];now.y=sy[ss];now.ti=ans[ss];Q.push(now);while(!Q.empty()){node te=Q.front();Q.pop();if(te.x==dx[ss]&&te.y==dy[ss]){ans[ss]=te.ti;break;//cout<<"eee--->"<<ans[ss]<<endl;}for(int i=0; i<4; i++){int X=xx[i]+te.x;int Y=yy[i]+te.y;if(map[X][Y]&&!vis[X][Y]&&X>=0&&X<n&&Y>=0&&Y<m){vis[X][Y]=true;node num;num.x=X;num.y=Y;num.ti=te.ti+1;Q.push(num);}}}if(!ans[ss])return false;}return true; } int main() {while(cin>>n>>m){ans[0]=ans[1]=0;getchar();memset(map,1,sizeof(map));for(int i=0; i<n; i++){for(int j=0; j<m; j++){cin>>Map[i][j];if(Map[i][j]=='.')map[i][j]=1;if(Map[i][j]=='*')map[i][j]=0;if(Map[i][j]=='S'){sx[0]=i;sy[0]=j;}if(Map[i][j]=='X'){dx[0]=i;dy[0]=j;sx[1]=i;sy[1]=j;}if(Map[i][j]=='E'){dx[1]=i;dy[1]=j;}}getchar();}if(bfs())cout<<ans[0]+ans[1]<<endl;elsecout<<"DBZ Cheat Us"<<endl;}return 0; }
Description
? ? ? ?古有富可敵國萬三千,今有富可敵球DBZ。話說DBZ有一輛超級林肯加長,它的車頭在都江堰,而車尾卻在川大,經(jīng)過數(shù)月之久她終于到達(dá)了咱們成都東軟學(xué)院,引來無數(shù)人圍觀。可粗心的DBZ卻不知道將車的鑰匙丟在了車的何處,于是富可敵球的他懸賞50000000000萬(當(dāng)然這對于他來說都是小Case ^_^),公開懸賞找鑰匙。作為咱東軟學(xué)院平凡的你,肯定不想錯失這一次難得變?yōu)楦吒粠洝赘幻赖臋C(jī)會。若你想拿到獎金,那么你就需要用最快的方式找到鑰匙,并且拿給DBZ。
Input
? ? ? ?測試數(shù)據(jù)包含多組。
? ? ? ?每組測試數(shù)據(jù)第一行包含2個數(shù) n ( 1 < = n < = 500 ) , m ?( 1 < = m < = n ) ,代表車的長和寬。
? ? ? ?接下來包含n行,每行m個元素( 其中 '.' 代表可以通過的路徑, 'X' 代表鑰匙所在地, '*'代表障礙物, 'E' 代表DBZ鎖在地, 'S'代表你所在的位置。 每次你只能上下左右進(jìn)行移動。
Output
? ? ?輸出僅包含一行,即把鑰匙交給DBZ的最小時間,如果無法成功找到鑰匙或找到鑰匙無法成功交給DBZ,則輸出“DBZ Cheat Us"(沒有引號)。
Sample Input
4 4S.*...X.E.......4 4S.*..*X..***E...Sample Output
6DBZ Cheat Us總結(jié)
以上是生活随笔為你收集整理的Problem -B DBZ的钥匙的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最好用的jpg转pdf软件
- 下一篇: 【安全知识分享】PPTX|食堂食品安全卫