hdu-2102A计划(两层地图 bfs或者dfs)

来源:互联网 发布:淘宝达人怎么玩 编辑:程序博客网 时间:2024/05/21 18:50

A计划

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 17611    Accepted Submission(s): 4437


Problem Description
可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验。魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老。年迈的国王正是心急如焚,告招天下勇士来拯救公主。不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出。
现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示。骑士们一进入时空传输机就会被转到另一层的相对位置,但如果被转到的位置是墙的话,那骑士们就会被撞死。骑士们在一层中只能前后左右移动,每移动一格花1时刻。层间的移动只能通过时空传输机,且不需要任何时间。
 

Input
输入的第一行C表示共有C个测试数据,每个测试数据的前一行有三个整数N,M,T。 N,M迷宫的大小N*M(1 <= N,M <=10)。T如上所意。接下去的前N*M表示迷宫的第一层的布置情况,后N*M表示迷宫第二层的布置情况。
 

Output
如果骑士们能够在T时刻能找到公主就输出“YES”,否则输出“NO”。
 

Sample Input
15 5 14S*#*..#........****....#...*.P#.*..***.....*.*.#..
 

Sample Output
YES
 

Source
HDU 2007-6 Programming Contest
 

Recommend
xhd


bfs做法
#include<iostream>#include<string>#include<cstring>#include<queue>#include<cstdio>using namespace std;char map[2][15][15];int vis[2][15][15];int n,m,k;int dx[]={1,-1,0,0};int dy[]={0,0,-1,1};struct node{int x,y,z,ans;node(int a,int b,int c,int d){x=a;y=b;z=c;ans=d;}};void bfs(node v){queue<node> que;que.push(node (0,0,0,0));while(!que.empty()){node now=que.front();que.pop();int x1=now.x;int y1=now.y;int z1=now.z;int ans1=now.ans;if(map[z1][x1][y1]=='P'){if(ans1<=k){printf("YES\n");return ;}else {printf("NO\n");return ;}}for(int i=0;i<4;i++){int sx=x1+dx[i];int sy=y1+dy[i];if(!vis[z1][sx][sy]&&sx<n&&sx>=0&&sy>=0&&sy<m&&map[z1][sx][sy]=='#'&&map[1-z1][sx][sy]!='#'&&map[1-z1][sx][sy]!='*'&&!vis[1-z1][sx][sy]){vis[z1][sx][sy]=1;que.push(node(sx,sy,1-z1,ans1+1));}else if(!vis[z1][sx][sy]&&sx<n&&sx>=0&&sy>=0&&sy<m&&map[z1][sx][sy]!='#'&&map[z1][sx][sy]!='*'){vis[z1][sx][sy]=1;que.push(node(sx,sy,z1,ans1+1));}}}printf("NO\n");return;}int main(){int t;scanf("%d",&t);while(t--){memset(vis,0,sizeof(vis));memset(map,0,sizeof(map));scanf("%d%d%d",&n,&m,&k);for(int i=0;i<2;i++){for(int j=0;j<n;j++){scanf("%s",map[i][j]);}getchar();}vis[0][0][0]=1;node v(0,0,0,0);bfs(v);}return 0;}

dfs
#include<iostream>#include<string>#include<cstring>#include<cmath>#include<algorithm>using namespace std;int n,m,k;const int INF=100010;char map[2][15][15];int vis[2][15][15];int sx,sy,sz;int dx[]={1,-1,0,0};int dy[]={0,0,-1,1};bool dfs(int x,int y,int z,int ans){if(map[z][x][y]=='P'){if(ans<=k)return 1;else return 0;}for(int i=0;i<4;i++){int fx=x+dx[i];int fy=y+dy[i];if(fx<n&&fx>=0&&fy>=0&&fy<m&&map[z][fx][fy]=='#'&&vis[z][fx][fy]==0&&vis[1-z][fx][fy]==0&&map[1-z][fx][fy]!='#'&&map[1-z][fx][fy]!='*'){vis[1-z][fx][fy]=1;if(dfs(fx,fy,1-z,ans+1))return 1;//dfs(fx,fy,1-z,ans+1)vis[1-z][fx][fy]=0;}else if(fx>=0&&fx<n&&fy>=0&&fy<m&&vis[z][fx][fy]==0&&map[z][fx][fy]!='*'&&map[z][fx][fy]!='#'){vis[z][fx][fy]=1;if(dfs(fx,fy,z,ans+1)) return 1;//dfs(fx,fy,z,ans+1)vis[z][fx][fy]=0;}}return 0;}int main(){int t;scanf("%d",&t);while(t--){scanf("%d%d%d",&n,&m,&k);memset(vis,0,sizeof(vis));memset(map,0,sizeof(map));for(int i=0;i<2;i++){for(int j=0;j<n;j++){scanf("%s",map[i][j]);}getchar();}vis[0][0][0]=1;if(dfs(0,0,0,0))printf("YES\n");else printf("NO\n");}return 0;}/*5 5 14S*#*..#........****....#...*.P#.*..***.....*.*.##.no15 5 14S*#*..#........****....#...*.P#.*..***.....*.*.#..yes */ 



 
0 0
原创粉丝点击