【HDU - 2102】A计划 (麻烦一点的bfs)
題干:
可憐的公主在一次次被魔王擄走一次次被騎士們救回來之后,而今,不幸的她再一次面臨生命的考驗。魔王已經(jīng)發(fā)出消息說將在T時刻吃掉公主,因為他聽信謠言說吃公主的肉也能長生不老。年邁的國王正是心急如焚,告招天下勇士來拯救公主。不過公主早已習以為常,她深信智勇的騎士LJ肯定能將她救出。?
現(xiàn)據(jù)密探所報,公主被關在一個兩層的迷宮里,迷宮的入口是S(0,0,0),公主的位置用P表示,時空傳輸機用#表示,墻用*表示,平地用.表示。騎士們一進入時空傳輸機就會被轉到另一層的相對位置,但如果被轉到的位置是墻的話,那騎士們就會被撞死。騎士們在一層中只能前后左右移動,每移動一格花1時刻。層間的移動只能通過時空傳輸機,且不需要任何時間。
Input
輸入的第一行C表示共有C個測試數(shù)據(jù),每個測試數(shù)據(jù)的前一行有三個整數(shù)N,M,T。 N,M迷宮的大小N*M(1 <= N,M <=10)。T如上所意。接下去的前N*M表示迷宮的第一層的布置情況,后N*M表示迷宮第二層的布置情況。
Output
如果騎士們能夠在T時刻能找到公主就輸出“YES”,否則輸出“NO”。
Sample Input
1 5 5 14 S*#*. .#... ..... ****. ...#...*.P #.*.. ***.. ...*. *.#..Sample Output
YES解題報告:
? ? 簡單的bfs,只是需要判斷一下兩層的對應位置上都是 ' # ' 這種特殊情況就可以了。這種情況不加的話會wa的。
AC代碼:
#include<cstdio> #include<queue> #include<cstring> #include<cmath> #include<map> #include<iostream> #include<algorithm> #define ll long long using namespace std; struct Node {int x,y;int t;int deep;Node(){}Node(int deep,int x,int y,int t):deep(deep),x(x),y(y),t(t){} }; int n,m,k; bool vis[2][15][15];//0表示第一層,1表示第二層 char maze[2][15][15]; int nx[4] = {0,1,0,-1}; int ny[4] = {1,0,-1,0}; bool bfs() {memset(vis,0,sizeof(vis)); queue<Node> q;q.push((Node(0,1,1,0)));vis[0][1][1]=1;Node cur; while(q.size()) {cur = q.front();q.pop();if(maze[cur.deep][cur.x][cur.y] == 'P') {if(cur.t <=k) return 1;else return 0;}int tx,ty;for(int i = 0; i<4; i++) {tx = cur.x+nx[i];ty = cur.y+ny[i];if(maze[cur.deep][tx][ty] == '*' || vis[cur.deep][tx][ty] == 1) continue;if(tx < 1 || tx > n || ty < 1 || ty > m) continue;vis[cur.deep][tx][ty] = 1;if(maze[cur.deep][tx][ty] == '#' && maze[!cur.deep][tx][ty] != '*' && vis[!cur.deep][tx][ty] == 0) {vis[!cur.deep][tx][ty] = 1;q.push(Node(!cur.deep,tx,ty,cur.t+1));}else if(maze[cur.deep][tx][ty]=='.' || maze[cur.deep][tx][ty]=='P') {q.push(Node(cur.deep,tx,ty,cur.t+1));}}}return 0; } int main() {int t;cin>>t;while(t--) {scanf("%d%d%d",&n,&m,&k);for(int i = 1; i<=n; i++) {scanf("%s",maze[0][i]+1);}for(int i = 1; i<=n; i++) {scanf("%s",maze[1][i]+1);}for(int i = 1; i<=n; i++) {for(int j = 1; j<=m; j++) {if(maze[0][i][j] == '#' && maze[1][i][j] == '#') {maze[0][i][j] = maze[1][i][j] = '*';}}}if(bfs()) printf("YES\n");else printf("NO\n");}return 0 ; }?
總結
以上是生活随笔為你收集整理的【HDU - 2102】A计划 (麻烦一点的bfs)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nod32kui.exe - nod32
- 下一篇: 【CodeForces - 205B 】