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=;
- char ch=getchar();
- while (ch<''||ch>'') ch=getchar();
- while (ch>=''&&ch<='') x=x*+ch-'',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[];
- int xx[]={,-,,};
- int yy[]={,,,-};
- int turn(char x)
- {
- if (x=='*') return INF;
- if (x=='.') return ;
- return ;
- }
- int Turn(char x)
- {
- if (x=='N') return ;
- if (x=='S') return ;
- if (x=='E') return ;
- if (x=='W') return ;
- }
- char turn(int x)
- {
- if (x==INF) return '*';
- if (x==) return '.';
- return 'X';
- }
- int check(int x,int y)
- {
- if (x>&&x<n+&&y>&&y<m+) return ;
- return ;
- }
- int bfs()
- {
- vis[][Sx][Sy]=;
- que.push(ss(Sx,Sy,));
- for (int i=;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+][now.x][now.y]) que.push(ss(now.x,now.y,i+)),vis[i+][now.x][now.y]=;
- }
- }
- }
- }
- int main()
- {
- n=read(),m=read();
- for (int i=;i<=n;i++)
- {
- scanf("%s",ch);
- for (int j=;j<=m;j++)
- {
- map[i][j]=turn(ch[j-]);
- if (map[i][j]==INF) {Sx=i;Sy=j;map[i][j]=;}
- }
- }
- q=read();
- for (int i=;i<=q;i++)
- {
- scanf("%s",ch);
- fx[i]=Turn(ch[]);
- }
- bfs();
- while (!que.empty())
- {
- ss now=que.front();que.pop();
- map[now.x][now.y]=INF;
- }
- for (int i=;i<=n;i++)
- {
- for (int j=;j<=m;j++) cout<<turn(map[i][j]);
- cout<<endl;
- }
- return ;
- }
(其实很恶心的说)
我的:
- #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[]={,-,,,};
- const int dy[]={,,,,-};
- int n,m,map[][],sx,sy,q,orientation[];
- char cur[];
- bool flag[][][];
- queue<struct node>que;
- int turn_charinint(char x)
- {
- if(x=='X') return ;
- if(x=='.') return ;
- if(x=='N') return ;
- if(x=='S') return ;
- if(x=='W') return ;
- if(x=='E') return ;
- return INF;
- }
- char turn_intinchar(int x)
- {
- if(x==INF) return '*';
- if(x==) return 'X';
- else return '.';
- }
- bool ok()
- {
- if(now.x+dx[orientation[now.step]]<=n&&now.x+dx[orientation[now.step]]>)
- if(now.y+dy[orientation[now.step]]<=m&&now.y+dy[orientation[now.step]]>)
- 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,));
- flag[sx][sy][]=true;
- for(int i=;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+]) continue;
- que.push(node(now.x,now.y,now.step+));
- flag[now.x][now.y][now.step+]=true;
- }
- }
- }
- }
- int main()
- {
- //scanf("%d%d",&n,&m);
- cin>>n>>m;
- for(int i=;i<=n;i++)
- {
- //scanf("%s",cur);
- cin>>cur;
- for(int j=;j<=m;j++)
- {
- map[i][j]=turn_charinint(cur[j-]);
- if(map[i][j]==INF)
- {
- sx=i,sy=j;
- map[i][j]=;
- }
- }
- }
- //scanf("%d",&q);
- cin>>q;
- for(int i=;i<=q;i++)
- {
- cin>>cur;
- orientation[i]=turn_charinint(cur[]);
- }
- bfs();
- while(!que.empty())
- {
- now=que.front();
- que.pop();
- map[now.x][now.y]=INF;
- }
- for(int i=;i<=n;i++)
- {
- for(int j=;j<=m;j++)
- {
- putchar(turn_intinchar(map[i][j]));
- }
- putchar('\n');
- }
- return ;
- }
AC日记——逃跑的拉尔夫 codevs 1026 (搜索)的更多相关文章
- AC日记——接龙游戏 codevs 1051
1051 接龙游戏 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 给出了N个单词,已经按长度排好了序.如果 ...
- AC日记——地鼠游戏 codevs 1052
1052 地鼠游戏 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 王钢是一名学习成绩优异的学生,在平 ...
- AC日记——鬼谷子的钱袋 codevs 2998
2998 鬼谷子的钱袋 2006年省队选拔赛湖南 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 鬼谷子非常聪明,正 ...
- AC日记——舒适的路线 codevs 1001 (并查集+乱搞)
1001 舒适的路线 2006年 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description Z小镇是 ...
- AC日记——自然数和分解 codevs 2549
自然数和分解 思路: 水题: 代码: #include <bits/stdc++.h> using namespace std; ][]; int main() { cin>> ...
- AC日记——郁闷的出纳员 codevs 1286
郁闷的出纳员 思路: 设工资下限为ko,然后ko--(因为要小于工资下限): 设cur为记录工资增长,降低: 设第i个人的工资为pos: 对应的四种操作: 插入:cur-pos-ko: 增长:cur- ...
- AC日记——营业额统计 1296 codevs
1296 营业额统计 2002年 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 查看运行结果 题目描述 Description Tiger ...
- AC日记——花店橱窗布置 codevs 1028
题目描述 Description 假设以最美观的方式布置花店的橱窗,有F束花,V个花瓶,我们用美学值(一个整数)表示每束花放入每个花瓶所产生的美学效果.为了取得最佳的美学效果,必须使花的摆放取得最大的 ...
- AC日记——最优贸易 codevs 1173
题目描述 Description [问题描述]C 国有n 个大城市和m 条道路,每条道路连接这n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这m 条道路中有一部分为单向通行的道路 ...
随机推荐
- ASP.NET WebAPI 13 Filter
Filter(筛选器)是基于AOP(面向方面编程)的设计,它的作用是Actionr的执行注入额外的逻辑,以达到横切注入的目的. IFilter 在WebAPI中所以的Filter都实现了IFilter ...
- percona 5.6升级到5.7相关error及解决方法
今早,把开发环境的mysql升级到了5.7.15,5.6数据导入后,启动一切正常,检查.err日志,发现有如下异常: 2016-10-31T00:29:33.187073Z 0 [Warning] S ...
- windbg定位死锁
操作系统对死锁的描述如下: 所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去. 那么为什么会产生死锁呢? 1.因为系统资源不足. ...
- CSS层次选择器温故-2
1.层次选择器 通过HTML的DOM元素间的层次关系获取元素,层次关系包括后代.父子.相邻兄弟和通用兄弟,通过其中某类关系可以方便快捷地选定需要的元素 2.语法 3.兼容性 IE7以及以上版本 4.后 ...
- BaseServlet
1. 目的: 将提升Servlet的处理请求的能力,而不只限于doGet()/doPost()等请求. 让其Servlet能够自己根据请求,从而触发相应的方法进行处理. 2. 具体代码实现: impo ...
- andriod ==和equals
== 用于数字 equals用于字符
- Atitit。 工作流引擎的发展趋势
Atitit. 工作流引擎的发展趋势 1.1. 图灵完备1 1.2. 图形化与文本化1 1.3. Jit1 1.4. Dsl化2 1.5. Oo2 1.6. 托管与本地代码的互操作2 1.7. 大型 ...
- R语言学习笔记:小试R环境
买了三本R语言的书,同时使用来学习R语言,粗略翻下来感觉第一本最好: <R语言编程艺术>The Art of R Programming <R语言初学者使用>A Beginne ...
- Android中使用抖动动画吸引来用户注意
原文:http://www.androidcn.org/topic/552e65bc61d460226ab27a5c 在应用中,有时候我们要吸引用户去点击某些按钮,比如应用市场的推荐按钮,为了能够吸引 ...
- Android 系统版本&API对照表
最新Android系统版本与API等级对应关系表 数据来源:http://d.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLe ...