日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

A计划——BFS

發(fā)布時間:2023/11/30 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 A计划——BFS 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

【題目描述】
可憐的公主在一次次被魔王擄走一次次被騎士們救回來之后,而今,不幸的她再一次面臨生命的考驗。魔王已經(jīng)發(fā)出消息說將在T時刻吃掉公主,因為他聽信謠言說吃公主的肉也能長生不老。年邁的國王正是心急如焚,告招天下勇士來拯救公主。不過公主早已習以為常,她深信智勇的騎士LJ肯定能將她救出。
現(xiàn)據(jù)密探所報,公主被關(guān)在一個兩層的迷宮里,迷宮的入口是S(0,0,0),公主的位置用P表示,時空傳輸機用#表示,墻用表示,平地用.表示。騎士們一進入時空傳輸機就會被轉(zhuǎn)到另一層的相對位置,但如果被轉(zhuǎn)到的位置是墻的話,那騎士們就會被撞死。騎士們在一層中只能前后左右移動,每移動一格花1時刻。層間的移動只能通過時空傳輸機,且不需要任何時間。
Input
輸入的第一行C表示共有C個測試數(shù)據(jù),每個測試數(shù)據(jù)的前一行有三個整數(shù)N,M,T。 N,M迷宮的大小NM(1 <= N,M <=10)。T如上所意。接下去的前NM表示迷宮的第一層的布置情況,后NM表示迷宮第二層的布置情況。
Output
如果騎士們能夠在T時刻能找到公主就輸出“YES”,否則輸出“NO”。
Sample Input

1 5 5 14 S*#*. .#... ..... ****. ...#...*.P #.*.. ***.. ...*. *.#..

Sample Output

YES

【題目分析】
因為想要盡可能快的救公主,所以用BFS比較好
需要注意的是時空傳輸機傳輸是不需要時間的,而且一遇到就會傳輸所以不能選擇(剛開始的時候忘記是不需要時間的所有想到了兩個傳輸機傳來傳去的情況卻想著這樣時間不允許所以就沒有特別處理,后來看到不需要時間又改了,可是又忘記這種情況了)
【AC代碼】

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<vector> #include<set> #include<string> #include<cmath> #include<climits>using namespace std;const int MAXN=15; int n,m,T; char map[2][MAXN][MAXN]; bool vis[2][MAXN][MAXN]; struct node {int x,y,z,Time; }t,p,S; const int drc[4][2]={1,0,-1,0,0,1,0,-1};bool BFS() {queue<node> q;int u,v;memset(vis,0,sizeof(vis));S.x=0; S.y=0; S.z=0; S.Time=0;vis[0][0][0]=true;q.push(S);while(!q.empty()){p=q.front(); q.pop();//if(p.Time>T) continue;if(map[p.z][p.x][p.y]=='P'){if(p.Time<=T)return true;else return false;}for(int i=0;i<4;i++){u=p.x+drc[i][0]; v=p.y+drc[i][1];if(u<0 || u>n-1 || v<0 || v>m-1) continue;if(map[p.z][u][v]=='*' || vis[p.z][u][v]==true) continue;vis[p.z][u][v]=true;t.x=u; t.y=v; t.z=p.z; t.Time=p.Time+1;if(map[t.z][t.x][t.y]=='#'){t.z=!p.z;if(map[t.z][t.x][t.y]=='#')//特別處理,不能忘記{vis[t.z][t.x][t.y]=true;}else if(map[t.z][t.x][t.y]!='*' && vis[t.z][t.x][t.y]==false){vis[t.z][t.x][t.y]=true;q.push(t);}}elseq.push(t);}}return false; }int main() {int Test;scanf("%d",&Test);while(Test--){scanf("%d%d%d",&n,&m,&T);memset(map,0,sizeof(map));for(int i=0;i<n;i++){scanf("%s",map[0][i]);}for(int i=0;i<n;i++){scanf("%s",map[1][i]);}if(BFS()){printf("YES\n");}else{printf("NO\n");}}return 0; }

【心得體會】
這么簡單一個程序改來改去一直wa,但是的確是能夠發(fā)現(xiàn)問題的,所以程序有問題不要暴躁,靜下來慢慢找問題,一定有哪里粗心或者題目沒有理解等等,程序是不會騙人的

總結(jié)

以上是生活随笔為你收集整理的A计划——BFS的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。