题目链接
可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验。魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老。年迈的国王正是心急如焚,告招天下勇士来拯救公主。不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出。
现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示。骑士们一进入时空传输机就会被转到另一层的相对位置,但如果被转到的位置是墙的话,那骑士们就会被撞死。骑士们在一层中只能前后左右移动,每移动一格花1时刻。层间的移动只能通过时空传输机,且不需要任何时间。
输入的第一行C表示共有C个测试数据,每个测试数据的前一行有三个整数N,M,T。 N,M迷宫的大小NM(1 <= N,M <=10)。T如上所意。接下去的前NM表示迷宫的第一层的布置情况,后N*M表示迷宫第二层的布置情况。
如果骑士们能够在T时刻能找到公主就输出“YES”,否则输出“NO”。
1
5 5 14
S*#*.
.#...
.....
****.
...#...*.P
#.*..
***..
...*.
*.#..
YES
一道狗血的BFS,细节很多反正,我尽量精简了代码,供大家参考,我的意见是条件判断尽量能用不等于就用不等于,直接用等于很容易遗漏,具体看代码吧/(ㄒoㄒ)/~~
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct node{int x,y,status,time;
};
int flag,n,m,t,vis[2][15][15],step[4][2]={-1,0,0,-1,1,0,0,1};
char g[2][15][15];
void bfs(){node a,b;queue<node>q;q.push({0,0,0,0});while(!q.empty()){a=q.front();q.pop();if(g[a.status][a.x][a.y]=='P' && a.time<=t){flag=1;return;}for(int i=0;i<4;i++){b.x=a.x+step[i][0],b.y=a.y+step[i][1],b.status=a.status,b.time=a.time+1;if(!vis[b.status][b.x][b.y] && b.x>=0 && b.x<n && b.y>=0 && b.y<m && b.time<=t){if(g[b.status][b.x][b.y]=='#' && g[b.status^1][b.x][b.y]!='#' && g[b.status^1][b.x][b.y]!='*'){vis[b.status][b.x][b.y]=1;b.status=b.status^1;q.push(b);}else if(g[b.status][b.x][b.y]!='#' && g[b.status][b.x][b.y]!='*'){vis[b.status][b.x][b.y]=1;q.push(b);}}}}
}main()
{int T;cin>>T;while(T--){memset(vis,0,sizeof(vis));flag=0;cin>>n>>m>>t;for(int k=0;k<2;k++){for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>g[k][i][j];}}}vis[0][0][0]=1;bfs();if(flag) puts("YES");else puts("NO");}
}
本文发布于:2024-01-27 19:41:39,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17063557012240.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |