1026 逃跑的拉尔夫

 时间限制: 1 s
 
 空间限制: 128000 KB
 
 题目等级 : 黄金 Gold
 
 
 
题目描述 Description
 

年轻的拉尔夫开玩笑地从一个小镇上偷走了一辆车,但他没想到的是那辆车属于警察局,并且车上装有用于发射车子移动路线的装置。

那个装置太旧了,以至于只能发射关于那辆车的移动路线的方向信息。

编写程序,通过使用一张小镇的地图帮助警察局找到那辆车。程序必须能表示出该车最终所有可能的位置。

小镇的地图是矩形的,上面的符号用来标明哪儿可以行车哪儿不行。“.”表示小镇上那块地方是可以行车的,而符号“X”表示此处不能行车。拉尔夫所开小车的初始位置用字符的“*”表示,且汽车能从初始位置通过。

汽车能向四个方向移动:向北(向上),向南(向下),向西(向左),向东(向右)。

拉尔夫所开小车的行动路线是通过一组给定的方向来描述的。在每个给定的方向,拉尔夫驾驶小车通过小镇上一个或更多的可行车地点。

输入描述 Input Description

输入文件的第一行包含两个用空格隔开的自然数R和C,1≤R≤50,1≤C≤50,分别表示小镇地图中的行数和列数。

以下的R行中每行都包含一组C个符号(“.”或“X”或“*”)用来描述地图上相应的部位。

接下来的第R+2行包含一个自然数N,1≤N≤1000,表示一组方向的长度。

接下来的N行幅行包含下述单词中的任一个:NORTH(北)、SOUTH(南)、WEST(西)和EAST(东),表示汽车移动的方向,任何两个连续的方向都不相同。

输出描述 Output Description

输出文件应包含用R行表示的小镇的地图(象输入文件中一样),字符“*”应该仅用来表示汽车最终可能出现的位置。

样例输入 Sample Input
 

4 5

.....

.X...

...*X

X.X..

3

NORTH

WEST

SOUTH

样例输出 Sample Output

.....

*X*..

*.*.X

X.X..

 
 
思路:
  大搜索
  地图范围50*50
  不搜索对不起出题人
  所以我刚开始打了一个深搜
  结果只有30分,其余全超时
  然后我又认真读了一遍题目
  又加了一个判断状态相同的剪枝
  结果第十个点re
  然后觉得可能是深搜的问题
  所以我又写了一个广搜的代码
  结果第十个点又wa了
  看了好久没看出来到底拿错了
  于是请hyxzc神犇来帮忙看一下
  hyxzc一看是道这么水的题
  本不想写代码的
  但是在我的苦苦哀求下
  边骂我没出息边给我敲代码
  然后我看了他的代码风格又写了一个代码
 
 
来,上代码:
 
  hyxzc:

  1. #include<cstdio>
  2. #include<queue>
  3. #include<iostream>
  4. #include<algorithm>
  5. #define maxn 1000+100
  6. #define INF 0x7fffffff
  7. #define M 100
  8.  
  9. using namespace std;
  10.  
  11. int read()
  12. {
  13. int x=;
  14. char ch=getchar();
  15. while (ch<''||ch>'') ch=getchar();
  16. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  17. return x;
  18. }
  19.  
  20. struct ss
  21. {
  22. int x,y,z;
  23. ss () {}
  24. ss (int x_,int y_,int z_) {x=x_,y=y_,z=z_;}
  25. };
  26.  
  27. queue<ss>que;
  28.  
  29. int vis[maxn][M][M],map[maxn][maxn],Sx,Sy,fx[maxn],n,m,q;
  30. char ch[];
  31. int xx[]={,-,,};
  32. int yy[]={,,,-};
  33.  
  34. int turn(char x)
  35. {
  36. if (x=='*') return INF;
  37. if (x=='.') return ;
  38. return ;
  39. }
  40.  
  41. int Turn(char x)
  42. {
  43. if (x=='N') return ;
  44. if (x=='S') return ;
  45. if (x=='E') return ;
  46. if (x=='W') return ;
  47. }
  48.  
  49. char turn(int x)
  50. {
  51. if (x==INF) return '*';
  52. if (x==) return '.';
  53. return 'X';
  54. }
  55.  
  56. int check(int x,int y)
  57. {
  58. if (x>&&x<n+&&y>&&y<m+) return ;
  59. return ;
  60. }
  61.  
  62. int bfs()
  63. {
  64. vis[][Sx][Sy]=;
  65. que.push(ss(Sx,Sy,));
  66. for (int i=;i<=q;i++)
  67. {
  68. while (que.front().z==i)
  69. {
  70. ss now=que.front();que.pop();
  71. while (check(now.x+xx[fx[i]],now.y+yy[fx[i]])&&map[now.x+xx[fx[i]]][now.y+yy[fx[i]]])
  72. {
  73. now.x+=xx[fx[i]],now.y+=yy[fx[i]];
  74. if (!vis[i+][now.x][now.y]) que.push(ss(now.x,now.y,i+)),vis[i+][now.x][now.y]=;
  75. }
  76. }
  77. }
  78. }
  79.  
  80. int main()
  81. {
  82. n=read(),m=read();
  83. for (int i=;i<=n;i++)
  84. {
  85. scanf("%s",ch);
  86. for (int j=;j<=m;j++)
  87. {
  88. map[i][j]=turn(ch[j-]);
  89. if (map[i][j]==INF) {Sx=i;Sy=j;map[i][j]=;}
  90. }
  91. }
  92. q=read();
  93. for (int i=;i<=q;i++)
  94. {
  95. scanf("%s",ch);
  96. fx[i]=Turn(ch[]);
  97. }
  98. bfs();
  99. while (!que.empty())
  100. {
  101. ss now=que.front();que.pop();
  102. map[now.x][now.y]=INF;
  103. }
  104. for (int i=;i<=n;i++)
  105. {
  106. for (int j=;j<=m;j++) cout<<turn(map[i][j]);
  107. cout<<endl;
  108. }
  109. return ;
  110. }

(其实很恶心的说)

我的:

  1. #include<queue>
  2. #include<cstdio>
  3. #include<iostream>
  4.  
  5. #define INF 0x7fffffff
  6.  
  7. using namespace std;
  8.  
  9. struct node {
  10. int x,y,step;
  11. node () {}
  12. node (int x_,int y_,int step_) {x=x_,y=y_,step=step_;}
  13. };
  14. struct node now;
  15.  
  16. const int dx[]={,-,,,};
  17. const int dy[]={,,,,-};
  18.  
  19. int n,m,map[][],sx,sy,q,orientation[];
  20.  
  21. char cur[];
  22.  
  23. bool flag[][][];
  24.  
  25. queue<struct node>que;
  26.  
  27. int turn_charinint(char x)
  28. {
  29. if(x=='X') return ;
  30. if(x=='.') return ;
  31. if(x=='N') return ;
  32. if(x=='S') return ;
  33. if(x=='W') return ;
  34. if(x=='E') return ;
  35. return INF;
  36. }
  37.  
  38. char turn_intinchar(int x)
  39. {
  40. if(x==INF) return '*';
  41. if(x==) return 'X';
  42. else return '.';
  43. }
  44.  
  45. bool ok()
  46. {
  47. if(now.x+dx[orientation[now.step]]<=n&&now.x+dx[orientation[now.step]]>)
  48. if(now.y+dy[orientation[now.step]]<=m&&now.y+dy[orientation[now.step]]>)
  49. if(map[now.x+dx[orientation[now.step]]][now.y+dy[orientation[now.step]]])
  50. return true;
  51. return false;
  52. }
  53.  
  54. void bfs()
  55. {
  56. que.push(node(sx,sy,));
  57. flag[sx][sy][]=true;
  58. for(int i=;i<=q;i++)
  59. {
  60. while(que.front().step==i)
  61. {
  62. now=que.front();
  63. que.pop();
  64. while(ok())
  65. {
  66. now=node(now.x+dx[orientation[now.step]],now.y+dy[orientation[now.step]],now.step);
  67. if(flag[now.x][now.y][now.step+]) continue;
  68. que.push(node(now.x,now.y,now.step+));
  69. flag[now.x][now.y][now.step+]=true;
  70. }
  71. }
  72. }
  73. }
  74.  
  75. int main()
  76. {
  77. //scanf("%d%d",&n,&m);
  78. cin>>n>>m;
  79. for(int i=;i<=n;i++)
  80. {
  81. //scanf("%s",cur);
  82. cin>>cur;
  83. for(int j=;j<=m;j++)
  84. {
  85. map[i][j]=turn_charinint(cur[j-]);
  86. if(map[i][j]==INF)
  87. {
  88. sx=i,sy=j;
  89. map[i][j]=;
  90. }
  91. }
  92. }
  93. //scanf("%d",&q);
  94. cin>>q;
  95. for(int i=;i<=q;i++)
  96. {
  97. cin>>cur;
  98. orientation[i]=turn_charinint(cur[]);
  99. }
  100. bfs();
  101. while(!que.empty())
  102. {
  103. now=que.front();
  104. que.pop();
  105. map[now.x][now.y]=INF;
  106. }
  107. for(int i=;i<=n;i++)
  108. {
  109. for(int j=;j<=m;j++)
  110. {
  111. putchar(turn_intinchar(map[i][j]));
  112. }
  113. putchar('\n');
  114. }
  115. return ;
  116. }
 

AC日记——逃跑的拉尔夫 codevs 1026 (搜索)的更多相关文章

  1. AC日记——接龙游戏 codevs 1051

    1051 接龙游戏  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description 给出了N个单词,已经按长度排好了序.如果 ...

  2. AC日记——地鼠游戏 codevs 1052

    1052 地鼠游戏  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 王钢是一名学习成绩优异的学生,在平 ...

  3. AC日记——鬼谷子的钱袋 codevs 2998

    2998 鬼谷子的钱袋 2006年省队选拔赛湖南  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master    题目描述 Description 鬼谷子非常聪明,正 ...

  4. AC日记——舒适的路线 codevs 1001 (并查集+乱搞)

    1001 舒适的路线 2006年  时间限制: 2 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description Z小镇是 ...

  5. AC日记——自然数和分解 codevs 2549

    自然数和分解 思路: 水题: 代码: #include <bits/stdc++.h> using namespace std; ][]; int main() { cin>> ...

  6. AC日记——郁闷的出纳员 codevs 1286

    郁闷的出纳员 思路: 设工资下限为ko,然后ko--(因为要小于工资下限): 设cur为记录工资增长,降低: 设第i个人的工资为pos: 对应的四种操作: 插入:cur-pos-ko: 增长:cur- ...

  7. AC日记——营业额统计 1296 codevs

    1296 营业额统计 2002年  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解  查看运行结果     题目描述 Description Tiger ...

  8. AC日记——花店橱窗布置 codevs 1028

    题目描述 Description 假设以最美观的方式布置花店的橱窗,有F束花,V个花瓶,我们用美学值(一个整数)表示每束花放入每个花瓶所产生的美学效果.为了取得最佳的美学效果,必须使花的摆放取得最大的 ...

  9. AC日记——最优贸易 codevs 1173

    题目描述 Description [问题描述]C 国有n 个大城市和m 条道路,每条道路连接这n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这m 条道路中有一部分为单向通行的道路 ...

随机推荐

  1. ASP.NET WebAPI 13 Filter

    Filter(筛选器)是基于AOP(面向方面编程)的设计,它的作用是Actionr的执行注入额外的逻辑,以达到横切注入的目的. IFilter 在WebAPI中所以的Filter都实现了IFilter ...

  2. percona 5.6升级到5.7相关error及解决方法

    今早,把开发环境的mysql升级到了5.7.15,5.6数据导入后,启动一切正常,检查.err日志,发现有如下异常: 2016-10-31T00:29:33.187073Z 0 [Warning] S ...

  3. windbg定位死锁

    操作系统对死锁的描述如下: 所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去. 那么为什么会产生死锁呢? 1.因为系统资源不足. ...

  4. CSS层次选择器温故-2

    1.层次选择器 通过HTML的DOM元素间的层次关系获取元素,层次关系包括后代.父子.相邻兄弟和通用兄弟,通过其中某类关系可以方便快捷地选定需要的元素 2.语法 3.兼容性 IE7以及以上版本 4.后 ...

  5. BaseServlet

    1. 目的: 将提升Servlet的处理请求的能力,而不只限于doGet()/doPost()等请求. 让其Servlet能够自己根据请求,从而触发相应的方法进行处理. 2. 具体代码实现: impo ...

  6. andriod ==和equals

    == 用于数字 equals用于字符

  7. Atitit。  工作流引擎的发展趋势

    Atitit.  工作流引擎的发展趋势 1.1. 图灵完备1 1.2. 图形化与文本化1 1.3. Jit1 1.4. Dsl化2 1.5. Oo2 1.6. 托管与本地代码的互操作2 1.7. 大型 ...

  8. R语言学习笔记:小试R环境

    买了三本R语言的书,同时使用来学习R语言,粗略翻下来感觉第一本最好: <R语言编程艺术>The Art of R Programming <R语言初学者使用>A Beginne ...

  9. Android中使用抖动动画吸引来用户注意

    原文:http://www.androidcn.org/topic/552e65bc61d460226ab27a5c 在应用中,有时候我们要吸引用户去点击某些按钮,比如应用市场的推荐按钮,为了能够吸引 ...

  10. Android 系统版本&API对照表

    最新Android系统版本与API等级对应关系表 数据来源:http://d.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLe ...