【Search&String Algorithm Training】Xiper的奇妙历险(2)
来源:互联网 发布:python参考手册 第5版 编辑:程序博客网 时间:2024/05/17 23:57
【Search&String Algorithm Training】- B 三维迷宫
转眼间,已经过了10年。
和日天都以优异的成绩,从UESTC毕业了。
毕业之后,
总觉得自己的智商越来越低了。
久而久之,
发现日天竟然在程序里下毒!
日天面对
亲手给他带上手铐。
然而就在
准备给日天带上手铐时,日天微微一笑,竟从背后掏出了一条咸鱼!
“我不做人啦,
!”
潘警官赶忙掏出光剑,向日天砍去。不料成为咸鱼王的日天已然是刀枪不入,毫发无损。
面对强大的日天,
丝毫不慌,他示意潘警官在豪宅外守候,自己只身迎战。
在
的智商碾压之下,日天被诱入火海之中。被火焰包围的日天发出一阵阵的惨叫声,怕是药丸。
现在,已经打败了日天的
要尽快逃出这间在熊熊燃烧的祖传豪宅。
为了简化问题,我们将房子简化成一个
列的网格图,并用不同的字符表示每个格点的状态。
.
—— 表示该位置为空。
—— 表示该位置上有障碍,不能移动。
—— 表示上楼的楼梯入口。
—— 表示下楼的楼梯入口。
现在所在的位置。
要到达的出口的位置,保证在第一层楼的边界上。
每秒
不能移动到边界外的地方,也不能移动到障碍上。
保证顶楼没有上楼入口,底层没有下楼入口,每个下楼入口对应的出口只会是上楼入口或者障碍,反之亦然。
一个上楼入口只会对应一个下楼入口,且所在层数相邻,所处的行和列一致,反之亦然。
注意,同一层楼可能存在多个楼梯;当楼梯入口对应的出口被障碍堵住时,
就无法到达出口的位置了。
现在
想知道,他最少要用多少时间能逃出来?
Input
第一行三个数字
,表示豪宅的大小。
接下来从第
的字符串表示该层的状态。
Output
如果可以到达,输出一个数
。
Sample input and output
1 1 2XY
1
2 2 2YU..XDxx
3
Source
忘了输出-1了尴尬⊙﹏⊙‖∣ 调了半天
#include<bits/stdc++.h>using namespace std;int N,L,R;char s[55][55][55];const int INF = (1<<30);int mark[55][55][55]={INF};bool inq[55][55][55];const int dx[]={-1,1,0,0},dy[]={0,0,1,-1};#define inrange(x,y) (1<=(x)&&(x)<=L&&1<=(y)&&(y)<=R)struct Position{int cur,x,y;}st,u,v;queue<Position> q;int nx,ny,ncur;int bfs(){q.push(st);mark[st.cur][st.x][st.y] = 0;inq[st.cur][st.x][st.y] = 1;while(!q.empty()){ u = q.front();q.pop();ncur = u.cur;if(s[ncur][u.x][u.y]=='Y')return mark[ncur][u.x][u.y];for(int i=0;i<4;i++){nx = u.x+dx[i];ny = u.y+dy[i];if(inrange(nx,ny)&&!inq[ncur][nx][ny]){switch(s[ncur][nx][ny]){case 'x':break;case 'Y':case '.':inq[ncur][nx][ny] = 1;mark[ncur][nx][ny] = mark[u.cur][u.x][u.y]+1;q.push((Position){ncur,nx,ny});break;case 'U'://1:inq[ncur][nx][ny] = 1;mark[ncur][nx][ny] = mark[u.cur][u.x][u.y]+1;q.push((Position){ncur,nx,ny});//2:if(s[ncur+1][nx][ny]!='x'&&!inq[ncur+1][nx][ny]){inq[ncur+1][nx][ny] = 1;mark[ncur+1][nx][ny] = mark[u.cur][u.x][u.y]+2;q.push((Position){ncur+1,nx,ny});}break;case 'D':inq[ncur][nx][ny] = 1;mark[ncur][nx][ny] = mark[u.cur][u.x][u.y]+1;q.push((Position){ncur,nx,ny});if(s[ncur-1][nx][ny]!='x'&&!inq[ncur-1][nx][ny]){inq[ncur-1][nx][ny] = 1;mark[ncur-1][nx][ny] = mark[u.cur][u.x][u.y]+2;q.push((Position){ncur-1,nx,ny});}default:;}}} }return -1;}int main(){ios::sync_with_stdio(false);cin>>N>>L>>R;for(int k=1;k<=N;k++)for(int i=1;i<=L;i++)for(int j=1;j<=R;j++){cin>>s[k][i][j];if(s[k][i][j]=='X')st.cur = k,st.x = i,st.y = j;}cout<<bfs();return 0;}
#include<bits/stdc++.h> using namespace std; #define MAXN 55 char s[MAXN][MAXN][MAXN]; int visit[MAXN][MAXN][MAXN];//记忆化数组 struct node{ int n,l,r,step; }start; struct node2 { int dl,dr; }dre[4]; int n,l,r; int bfs(struct node start) { int i; queue<node> q; q.push(start);//初始状态入队 while(!q.empty()) { struct node x=q.front(); q.pop(); if(s[x.n][x.l][x.r]=='Y') return x.step; for(i=0;i<4;i++)//前后左右 { int nn=x.n; int ll=x.l+dre[i].dl; int rr=x.r+dre[i].dr; if(ll<l&&ll>=0&&rr<r&&rr>=0&&!visit[nn][ll][rr]&&s[x.n][ll][rr]!='x')//判断是否合法 { struct node y=x; y.step++; y.l=ll; y.r=rr; visit[nn][ll][rr]=1; q.push(y); } } if(s[x.n][x.l][x.r]=='U'&&s[x.n+1][x.l][x.r]!='x'&&!visit[x.n+1][x.l][x.r])//上楼 { struct node y=x; y.n++; y.step++; visit[y.n][y.l][y.r]=1; q.push(y); } else if(s[x.n][x.l][x.r]=='D'&&s[x.n-1][x.l][x.r]!='x'&&!visit[x.n-1][x.l][x.r])//下楼 { struct node y=x; y.n--; y.step++; visit[y.n][y.l][y.r]=1; q.push(y); } } return -1; } int main() { int i,j,k,flag=1; char ch; scanf("%d%d%d",&n,&l,&r); memset(visit,0,sizeof(visit)); dre[0].dl=0;//方向数组 dre[0].dr=1; dre[1].dl=1; dre[1].dr=0; dre[2].dl=-1; dre[2].dr=0; dre[3].dl=0; dre[3].dr=-1; for(i=0;i<n;i++) { for(j=0;j<l;j++) { scanf("%s",s[i][j]); for(k=0;k<r&&flag;k++) { if(s[i][j][k]=='X') { start.n=i; start.l=j; start.r=k; start.step=0; flag=0; break; } } } } visit[start.n][start.l][start.r]=1; printf("%d",bfs(start)); return 0; }
#include<bits/stdc++.h>using namespace std;int N,L,R;char s[55][55][55];const int INF = (1<<30);int mark[55][55][55]={INF};bool inq[55][55][55];const int dx[]={-1,1,0,0},dy[]={0,0,1,-1};#define inrange(x,y) (1<=(x)&&(x)<=L&&1<=(y)&&(y)<=R)struct Position{int cur,x,y;}st,u,v;queue<Position> q;int nx,ny,ncur;int bfs(){q.push(st);mark[st.cur][st.x][st.y] = 0;inq[st.cur][st.x][st.y] = 1;while(!q.empty()){ u = q.front();q.pop();ncur = u.cur;if(s[ncur][u.x][u.y]=='Y')return mark[ncur][u.x][u.y];switch(s[u.cur][u.x][u.y]){case 'U':if(!inq[ncur+1][u.x][u.y]&&s[ncur+1][u.x][u.y]!='x'){inq[ncur+1][u.x][u.y] = 1;q.push((Position){ncur+1,u.x,u.y});mark[ncur+1][u.x][u.y] = mark[ncur][u.x][u.y]+1;}break;case 'D':if(!inq[ncur-1][u.x][u.y]&&s[ncur-1][u.x][u.y]!='x'){inq[ncur-1][u.x][u.y] = 1;q.push((Position){ncur-1,u.x,u.y});mark[ncur-1][u.x][u.y] = mark[ncur][u.x][u.y]+1;}break;default:break;}for(int i=0;i<4;i++){nx = u.x+dx[i];ny = u.y+dy[i];if(inrange(nx,ny)&&s[ncur][nx][ny]!='x'&&!inq[ncur][nx][ny]){q.push((Position){ncur,nx,ny});mark[ncur][nx][ny] = mark[ncur][u.x][u.y]+1;inq[ncur][nx][ny]=1;}}}return -1;}int main(){ios::sync_with_stdio(false);cin>>N>>L>>R;for(int k=1;k<=N;k++)for(int i=1;i<=L;i++)for(int j=1;j<=R;j++){cin>>s[k][i][j];if(s[k][i][j]=='X')st.cur = k,st.x = i,st.y = j;}cout<<bfs();return 0;}
- 【Search&String Algorithm Training】Xiper的奇妙历险(2)
- 【Search&String Algorithm Training】Xiper的奇妙历险(1)
- 2016 UESTC Training Search Algorithm and StringB - Xiper的奇妙历险(2)(三维迷宫)
- 2016 UESTC Training for Search Algorithm & String A - Xiper的奇妙历险(1) 八皇后问题、dfs
- B - Xiper的奇妙历险(2)
- CDOJ (UESTC OJ) 1380 Xiper的奇妙历险(3)
- 【cdoj 1380】 Xiper的奇妙历险(3) bfs+逆向思维 有质量的bfs
- 【Search&String Algorithm Training】谭爷剪花布条
- 2016 UESTC Training for Search Algorithm & String K - 卿大爷的三个女友 KMP、跳转数组
- Quick Search algorithm (string)
- 2016 UESTC Training for Search Algorithm & String(A B C E I K)
- 2016 UESTC Training for Search Algorithm & String E - 吴队长征婚 dfs剪枝、好题
- 2016 UESTC Training for Search Algorithm & String H - 中二少女与字符串 Trie 字典树
- 2016 UESTC Training for Search Algorithm & String I - 谭爷剪花布条 KMP
- UESTC Training for Search Algorithm(总结)
- 2014 UESTC Training for Search Algorithm B
- 2014 UESTC Training for Search Algorithm C
- 2014 UESTC Training for Search Algorithm
- HTML5+JS游戏开发模块----canvas打字游戏升级版
- 对10个数进行排序
- Matlab2014a在Ubuntu16.04中的安装及遇到的问题
- Java知识碎片整理(1)——数组相关
- 分时系统与实时系统
- 【Search&String Algorithm Training】Xiper的奇妙历险(2)
- 编程相关的知识点细节
- 纵横字谜的答案
- uploadify+java实现多文件上传和预览
- 有关指针(2)
- 【POJ 3688 Cheat in the Game】+ dp + 巴什博弈
- GPUImage--视频流处理之AVCaptureVideoDataOutputSampleBufferDelegate
- 郁闷的C小加(一)
- 欢迎使用CSDN-markdown编辑器