AC日记——逃跑的拉尔夫 codevs 1026 (搜索)
Posted Only U - IU
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AC日记——逃跑的拉尔夫 codevs 1026 (搜索)相关的知识,希望对你有一定的参考价值。
年轻的拉尔夫开玩笑地从一个小镇上偷走了一辆车,但他没想到的是那辆车属于警察局,并且车上装有用于发射车子移动路线的装置。
那个装置太旧了,以至于只能发射关于那辆车的移动路线的方向信息。
编写程序,通过使用一张小镇的地图帮助警察局找到那辆车。程序必须能表示出该车最终所有可能的位置。
小镇的地图是矩形的,上面的符号用来标明哪儿可以行车哪儿不行。“.”表示小镇上那块地方是可以行车的,而符号“X”表示此处不能行车。拉尔夫所开小车的初始位置用字符的“*”表示,且汽车能从初始位置通过。
汽车能向四个方向移动:向北(向上),向南(向下),向西(向左),向东(向右)。
拉尔夫所开小车的行动路线是通过一组给定的方向来描述的。在每个给定的方向,拉尔夫驾驶小车通过小镇上一个或更多的可行车地点。
输入文件的第一行包含两个用空格隔开的自然数R和C,1≤R≤50,1≤C≤50,分别表示小镇地图中的行数和列数。
以下的R行中每行都包含一组C个符号(“.”或“X”或“*”)用来描述地图上相应的部位。
接下来的第R+2行包含一个自然数N,1≤N≤1000,表示一组方向的长度。
接下来的N行幅行包含下述单词中的任一个:NORTH(北)、SOUTH(南)、WEST(西)和EAST(东),表示汽车移动的方向,任何两个连续的方向都不相同。
输出文件应包含用R行表示的小镇的地图(象输入文件中一样),字符“*”应该仅用来表示汽车最终可能出现的位置。
4 5
.....
.X...
...*X
X.X..
3
NORTH
WEST
SOUTH
.....
*X*..
*.*.X
X.X..
#include<cstdio> #include<queue> #include<iostream> #include<algorithm> #define maxn 1000+100 #define INF 0x7fffffff #define M 100 using namespace std; int read() { int x=0; char ch=getchar(); while (ch<‘0‘||ch>‘9‘) ch=getchar(); while (ch>=‘0‘&&ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar(); return x; } struct ss { int x,y,z; ss () {} ss (int x_,int y_,int z_) {x=x_,y=y_,z=z_;} }; queue<ss>que; int vis[maxn][M][M],map[maxn][maxn],Sx,Sy,fx[maxn],n,m,q; char ch[10000]; int xx[]={1,-1,0,0}; int yy[]={0,0,1,-1}; int turn(char x) { if (x==‘*‘) return INF; if (x==‘.‘) return 1; return 0; } int Turn(char x) { if (x==‘N‘) return 1; if (x==‘S‘) return 0; if (x==‘E‘) return 2; if (x==‘W‘) return 3; } char turn(int x) { if (x==INF) return ‘*‘; if (x==1) return ‘.‘; return ‘X‘; } int check(int x,int y) { if (x>0&&x<n+1&&y>0&&y<m+1) return 1; return 0; } int bfs() { vis[1][Sx][Sy]=1; que.push(ss(Sx,Sy,1)); for (int i=1;i<=q;i++) { while (que.front().z==i) { ss now=que.front();que.pop(); while (check(now.x+xx[fx[i]],now.y+yy[fx[i]])&&map[now.x+xx[fx[i]]][now.y+yy[fx[i]]]) { now.x+=xx[fx[i]],now.y+=yy[fx[i]]; if (!vis[i+1][now.x][now.y]) que.push(ss(now.x,now.y,i+1)),vis[i+1][now.x][now.y]=1; } } } } int main() { n=read(),m=read(); for (int i=1;i<=n;i++) { scanf("%s",ch); for (int j=1;j<=m;j++) { map[i][j]=turn(ch[j-1]); if (map[i][j]==INF) {Sx=i;Sy=j;map[i][j]=1;} } } q=read(); for (int i=1;i<=q;i++) { scanf("%s",ch); fx[i]=Turn(ch[0]); } bfs(); while (!que.empty()) { ss now=que.front();que.pop(); map[now.x][now.y]=INF; } for (int i=1;i<=n;i++) { for (int j=1;j<=m;j++) cout<<turn(map[i][j]); cout<<endl; } return 0; }
(其实很恶心的说)
我的:
#include<queue> #include<cstdio> #include<iostream> #define INF 0x7fffffff using namespace std; struct node { int x,y,step; node () {} node (int x_,int y_,int step_) {x=x_,y=y_,step=step_;} }; struct node now; const int dx[5]={0,-1,0,1,0}; const int dy[5]={0,0,1,0,-1}; int n,m,map[100][100],sx,sy,q,orientation[1001]; char cur[100]; bool flag[60][60][1100]; queue<struct node>que; int turn_charinint(char x) { if(x==‘X‘) return 0; if(x==‘.‘) return 1; if(x==‘N‘) return 1; if(x==‘S‘) return 3; if(x==‘W‘) return 4; if(x==‘E‘) return 2; return INF; } char turn_intinchar(int x) { if(x==INF) return ‘*‘; if(x==0) return ‘X‘; else return ‘.‘; } bool ok() { if(now.x+dx[orientation[now.step]]<=n&&now.x+dx[orientation[now.step]]>0) if(now.y+dy[orientation[now.step]]<=m&&now.y+dy[orientation[now.step]]>0) if(map[now.x+dx[orientation[now.step]]][now.y+dy[orientation[now.step]]]) return true; return false; } void bfs() { que.push(node(sx,sy,1)); flag[sx][sy][1]=true; for(int i=1;i<=q;i++) { while(que.front().step==i) { now=que.front(); que.pop(); while(ok()) { now=node(now.x+dx[orientation[now.step]],now.y+dy[orientation[now.step]],now.step); if(flag[now.x][now.y][now.step+1]) continue; que.push(node(now.x,now.y,now.step+1)); flag[now.x][now.y][now.step+1]=true; } } } } int main() { //scanf("%d%d",&n,&m); cin>>n>>m; for(int i=1;i<=n;i++) { //scanf("%s",cur); cin>>cur; for(int j=1;j<=m;j++) { map[i][j]=turn_charinint(cur[j-1]); if(map[i][j]==INF) { sx=i,sy=j; map[i][j]=1; } } } //scanf("%d",&q); cin>>q; for(int i=1;i<=q;i++) { cin>>cur; orientation[i]=turn_charinint(cur[0]); } bfs(); while(!que.empty()) { now=que.front(); que.pop(); map[now.x][now.y]=INF; } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { putchar(turn_intinchar(map[i][j])); } putchar(‘\n‘); } return 0; }
以上是关于AC日记——逃跑的拉尔夫 codevs 1026 (搜索)的主要内容,如果未能解决你的问题,请参考以下文章