【NOIP practice】BSOJ 1097 拯救博士 扫描法
来源:互联网 发布:汽车cae分析软件 编辑:程序博客网 时间:2024/04/29 21:57
1097 -- 【模拟试题】拯救博士
Description
话说在到BASHU国集中的途中, Mike博士神秘失踪了,最后发现是被外星人绑架了,幸好外星人目前还是在地球上活动,并且知道外星人不了解地球,所以使用的交通工具是最土的汽车。而且Mike博士身上装有用于发射移动路线的装置。
那个装置太旧了,以至于只能发射有关的移动路线的方向信息。
寻找Mike博士的任务便交给了你,编写程序,通过使用一张地图帮助研究所找到Mike博士。程序必须能表示出该车最终所有可能的位置。
地图是矩形的,上面的符号用来标明哪儿可以行车哪儿不行。"."表示那块地方是可以行进的,而符号"X"表示此处不通。而用"*"表示发现Mike博士失踪的地点.
车能向四个方向移动:向北(向上),向南(向下),向西(向左),向东(向右)。
Input
第一行包含两个用空格隔开的自然数R和C,1≤K≤200,1≤C≤200,分别表示地图中的行数和列数。
以下的K行中每行都包含一组符号("."或"X"或"*")用来描述地图上相应的部位。
接下来的一行包含一个自然数N,1≤N≤1000,表示一组方向的长度。
接下来的N行幅行包含下述单词中的任一个:NORTH(北)、SOUTH(南)、WEST(西)和EAST(东),表示汽车移动的方向,任何两个连续的方向都不相同。
Output
输出文件应包含用K行表示的地图(象输入文件中一样),字符"*"应该仅用来表示Mike博士最终可能出现的位置。
Sample Input
3 3
...
..X
*..
3
EAST
NORTH
WEST
Sample Output
*..
*.X
Description
话说在到BASHU国集中的途中, Mike博士神秘失踪了,最后发现是被外星人绑架了,幸好外星人目前还是在地球上活动,并且知道外星人不了解地球,所以使用的交通工具是最土的汽车。而且Mike博士身上装有用于发射移动路线的装置。
那个装置太旧了,以至于只能发射有关的移动路线的方向信息。
寻找Mike博士的任务便交给了你,编写程序,通过使用一张地图帮助研究所找到Mike博士。程序必须能表示出该车最终所有可能的位置。
地图是矩形的,上面的符号用来标明哪儿可以行车哪儿不行。"."表示那块地方是可以行进的,而符号"X"表示此处不通。而用"*"表示发现Mike博士失踪的地点.
车能向四个方向移动:向北(向上),向南(向下),向西(向左),向东(向右)。
Input
第一行包含两个用空格隔开的自然数R和C,1≤K≤200,1≤C≤200,分别表示地图中的行数和列数。
以下的K行中每行都包含一组符号("."或"X"或"*")用来描述地图上相应的部位。
接下来的一行包含一个自然数N,1≤N≤1000,表示一组方向的长度。
接下来的N行幅行包含下述单词中的任一个:NORTH(北)、SOUTH(南)、WEST(西)和EAST(东),表示汽车移动的方向,任何两个连续的方向都不相同。
Output
输出文件应包含用K行表示的地图(象输入文件中一样),字符"*"应该仅用来表示Mike博士最终可能出现的位置。
Sample Input
3 3
...
..X
*..
3
EAST
NORTH
WEST
Sample Output
*..
*.X
...
怎么说呢..这道题一开始没看懂BFS写了好久,以为只是规定了方向,其实还有一个时间限制,某一步只能走一个方向。
其实知道“某一步只能走给定方向”时,这道题就比较明显了,就是纯粹的模拟。
方法:每次输入方向,都把给定方向的matrix值设置为步数,遇到‘X’就停止,每次都只能在matrix值为当前步数-1的位置开始横向或纵向更新,以保证时间上的有序。最后,遇到值为总步数的点就输出‘.’即可!
#include<iostream>#include<iomanip>#include<cstring>#include<cmath>#include<cstdio>using namespace std;int n,m,k;int mat[505][505]={0};//嫌麻烦后面都用的cin cout输出.. int main(){ scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { char ch; cin>>ch; if(ch=='X')mat[i][j]=-2; if(ch=='.')mat[i][j]=-1;//一定要把为'.'的mat[][] 设为-1,因为要从mat[][]为0的点开始走 //这样处理,有且仅有为'*'的点值为0,即起点。 } scanf("%d",&k); string s;for(int p=1;p<=k;p++) { cin>>s; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { if(mat[i][j]==p-1)//满足时间的有序,从上一步开始走。 {//每个点横向或纵向更新mat[][]为当前步数p,遇到X就停止 if(s=="EAST") { for(int q=j+1;q<=m;q++){if(mat[i][q]==-2)break;mat[i][q]=p;}}else if(s=="SOUTH"){for(int q=i+1;q<=n;q++){if(mat[q][j]==-2)break;mat[q][j]=p;}}else if(s=="WEST"){for(int q=j-1;q>=1;q--){if(mat[i][q]==-2)break;mat[i][q]=p;}}else if(s=="NORTH"){for(int q=i-1;q>=1;q--){if(mat[q][j]==-2)break;mat[q][j]=p;}} }} } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(mat[i][j]==-2)cout<<"X"; else if(mat[i][j]==k)cout<<"*";//这个点是最终走到的点之一,即可能点。 else cout<<".";}cout<<endl;}return 0;}
0 0
- 【NOIP practice】BSOJ 1097 拯救博士 扫描法
- 【NOIP practice】BSOJ 1947 编码 递推
- 【NOIP practice】BSOJ 3140 冲出亚洲 模拟
- 【NOIP practice】BSOJ 2265 最大利润 树形动规
- 【NOIP practice】BSOJ 2998修复公路 最小生成树
- 【NOIP practice】BSOJ 3132 卡扎菲 并查集
- 【NOIP practice】BSOJ 3851 计算概率 智力题——加法原理
- 【NOIP practice】BSOJ 1709 守望者的烦恼 矩阵快速幂优化递推
- 【NOIP practice】 BSOJ1295 洗牌 智力题
- 【NOIP practice】BSOJ1878 山头狙击战 二分
- 【NOIP practice】BSOJ2175 股票 暴力+细节
- 【NOIP practice】BSOJ2264 火炬 基础算法+思考题
- Cpp环境【Vijos3160】【NOIP Practice】病毒分裂
- [noip测试]拯救紫萱学姐(kmp+树形dp)
- 【NOIP 模拟题】[T2]拯救紫萱学姐(kmp+树形dp)
- 拯救
- Cpp环境【NOIP practice】【BSOJ1878】【Vijos1172】 山头狙击战
- 博士
- NKOI 2151 烽火传递
- WebView的简单使用以及属性介绍
- Oracle学习笔记(十六)——数据字典和动态性能视图
- 《LeetBook》leetcode题解(10): Regular Expression Matching——DP解决正则匹配
- npm模块corn源码分析
- 【NOIP practice】BSOJ 1097 拯救博士 扫描法
- javascript中的this
- ubuntu运行sh脚本sudo自动输入密码
- 极大极小过程题集
- D23
- x265探索与研究(八):x265中的并行处理机制函数关系分析
- Android API Guides---App Manifest <application>
- Linux 安装apr-util
- HDU 2102 A计划