生活随笔
收集整理的這篇文章主要介紹了
A计划——BFS
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【題目描述】
可憐的公主在一次次被魔王擄走一次次被騎士們救回來之后,而今,不幸的她再一次面臨生命的考驗。魔王已經發出消息說將在T時刻吃掉公主,因為他聽信謠言說吃公主的肉也能長生不老。年邁的國王正是心急如焚,告招天下勇士來拯救公主。不過公主早已習以為常,她深信智勇的騎士LJ肯定能將她救出。
現據密探所報,公主被關在一個兩層的迷宮里,迷宮的入口是S(0,0,0),公主的位置用P表示,時空傳輸機用#表示,墻用表示,平地用.表示。騎士們一進入時空傳輸機就會被轉到另一層的相對位置,但如果被轉到的位置是墻的話,那騎士們就會被撞死。騎士們在一層中只能前后左右移動,每移動一格花1時刻。層間的移動只能通過時空傳輸機,且不需要任何時間。
Input
輸入的第一行C表示共有C個測試數據,每個測試數據的前一行有三個整數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(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,但是的確是能夠發現問題的,所以程序有問題不要暴躁,靜下來慢慢找問題,一定有哪里粗心或者題目沒有理解等等,程序是不會騙人的
總結
以上是生活随笔為你收集整理的A计划——BFS的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。