题意:给一个二维地图,每个点为障碍或者空地,有一个机器人有三种操作:1、向前走;2、左转90度;3、右转90度。现给定起点和终点,问到达终点最短路的条数。

思路:一般的题目只是求最短路的长度,但本题还要求出相应的条数。比赛时只记录最少的步数,却没有记录以最少步数到达该点的的条数,让他们一直入队.......铁定tle.......

只要记录好到达该点最少步数的条数,减少了很多重复入队..........

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <string>
  5. #include <algorithm>
  6. #include <queue>
  7. #define MAX 1111
  8. #define INF 0x7FFFFFFF
  9. using namespace std;
  10.  
  11. int n,m,mod;
  12. struct node {
  13. int x,y,dir;
  14. } st,end;
  15.  
  16. queue <node> q;
  17. char map[MAX][MAX];
  18. int num[MAX][MAX][4]; //步数
  19. int cnt[MAX][MAX][4]; //多少种路径以该方向到达该点
  20. int dx[] = {-1,0,1,0};
  21. int dy[] = {0,1,0,-1};
  22.  
  23. void init() {
  24. while(!q.empty()) q.pop();
  25. memset(num,-1,sizeof(num));
  26. memset(cnt,0,sizeof(cnt));
  27. }
  28.  
  29. int getdir(char c) {
  30. if(c == 'N') return 0;
  31. if(c == 'E') return 1;
  32. if(c == 'S') return 2;
  33. if(c == 'W') return 3;
  34. }
  35.  
  36. bool ok(int x,int y) {
  37. if(x >= 0 && x < n && y >= 0 && y < m && map[x][y] == '.') return true;
  38. return false;
  39. }
  40.  
  41. void bfs() {
  42. num[st.x][st.y][st.dir] = 0;
  43. cnt[st.x][st.y][st.dir] = 1;
  44. q.push(st);
  45. while(! q.empty()) {
  46. node t = q.front();
  47. q.pop();
  48. node tt;
  49. //cout << t.x << ' ' << t.y << ' ' << num[t.x][t.y][t.dir] << endl;
  50. for(int i=0; i<4; i++) { //转方向
  51. if(abs(t.dir - i) == 1 || abs(t.dir - i) == 3) {
  52. tt = t;
  53. if(num[t.x][t.y][i] == -1) {
  54. num[t.x][t.y][i] = num[t.x][t.y][t.dir] + 1;
  55. cnt[t.x][t.y][i] = cnt[t.x][t.y][t.dir];
  56. tt.dir = i;
  57. q.push(tt);
  58. } else if(num[t.x][t.y][i] == num[t.x][t.y][t.dir] + 1) {
  59. cnt[t.x][t.y][i] = (cnt[t.x][t.y][i] + cnt[t.x][t.y][t.dir]) % mod;
  60. }
  61. }
  62. }
  63. tt = t;
  64. tt.x += dx[tt.dir];
  65. tt.y += dy[tt.dir];
  66. if(ok(tt.x,tt.y)) {
  67. if(num[tt.x][tt.y][tt.dir] == -1) { //移动
  68. num[tt.x][tt.y][tt.dir] = num[t.x][t.y][t.dir] + 1;
  69. cnt[tt.x][tt.y][tt.dir] = cnt[t.x][t.y][t.dir];
  70. q.push(tt);
  71. } else if(num[tt.x][tt.y][tt.dir] == num[t.x][t.y][t.dir] + 1) {
  72. cnt[tt.x][tt.y][tt.dir] = (cnt[tt.x][tt.y][tt.dir] + cnt[t.x][t.y][t.dir]) % mod;
  73. }
  74. }
  75. }
  76. }
  77.  
  78. void solve() {
  79. int ans = INF;
  80. for(int i=0; i<4; i++) {
  81. if(num[end.x][end.y][i] != -1) {
  82. ans = min(ans,num[end.x][end.y][i]);
  83. }
  84. }
  85. if(ans == INF) {
  86. printf("%d -1\n",mod);
  87. return ;
  88. }
  89. int sum = 0;
  90. for(int i=0; i<4; i++) {
  91. if(num[end.x][end.y][i] == ans) sum = (sum + cnt[end.x][end.y][i]) % mod;
  92. }
  93. printf("%d %d\n",mod,sum);
  94. }
  95. int main() {
  96. char c;
  97. int ca = 1;
  98. while(scanf("%d%d%d",&n,&m,&mod) != EOF) {
  99. if(mod == 0) break;
  100. init();
  101. for(int i=0; i<n; i++) scanf("%s",map[i]);
  102. scanf("%d%d%d%d",&st.x,&st.y,&end.x,&end.y);
  103. scanf(" %c",&c);
  104. st.dir = getdir(c);
  105. bfs();
  106. printf("Case %d: ",ca++);
  107. solve();
  108. }
  109. return 0;
  110. }

HDU 4166 & BNU 32715 Robot Navigation (记忆化bfs)的更多相关文章

  1. HDU 4960 Another OCD Patient(记忆化搜索)

    HDU 4960 Another OCD Patient pid=4960" target="_blank" style="">题目链接 记忆化 ...

  2. 随手练——HDU 1078 FatMouse and Cheese(记忆化搜索)

    http://acm.hdu.edu.cn/showproblem.php?pid=1078 题意: 一张n*n的格子表格,每个格子里有个数,每次能够水平或竖直走k个格子,允许上下左右走,每次走的格子 ...

  3. HDU 4628 Pieces(状态压缩+记忆化搜索)

    http://acm.hdu.edu.cn/showproblem.php?pid=4628 题意:给个字符窜,每步都可以删除一个字符窜,问最少用多少步可以删除一个字符窜分析:状态压缩+记忆化搜索  ...

  4. HDU 4597 Play Game (DP,记忆化搜索,博弈)

    题意:Alice和Bob玩一个游戏,有两个长度为N的正整数数字序列,每次他们两个,只能从其中一个序列,选择两端中的一个拿走.他们都希望可以拿到尽量大的数字之和, 并且他们都足够聪明,每次都选择最优策略 ...

  5. HDU ACM 1078 FatMouse and Cheese 记忆化+DFS

    题意:FatMouse在一个N*N方格上找吃的,每一个点(x,y)有一些吃的,FatMouse从(0,0)的出发去找吃的.每次最多走k步,他走过的位置能够吃掉吃的.保证吃的数量在0-100.规定他仅仅 ...

  6. HDU 1331 Function Run Fun(记忆化搜索)

    Problem Description We all love recursion! Don't we? Consider a three-parameter recursive function w ...

  7. HDU - 5001 Walk(概率dp+记忆化搜索)

    Walk I used to think I could be anything, but now I know that I couldn't do anything. So I started t ...

  8. BNU 25593 Prime Time 记忆化dp

    题目链接:点击打开链接 题意: 一个游戏由3个人轮流玩 每局游戏由当中一名玩家选择一个数字作为開始 目的:获得最小的得分 对于当前玩家 O .面对 u 这个数字 则他的操作有: 1. 计分 u +1 ...

  9. HDU 3652 B-number(数位dp&amp;记忆化搜索)

    题目链接:[kuangbin带你飞]专题十五 数位DP G - B-number 题意 求1-n的范围里含有13且能被13整除的数字的个数. 思路 首先,了解这样一个式子:a%m == ((b%m)* ...

随机推荐

  1. CSS - ResetCss

    /* KISSY CSS Reset 理念:清除和重置是紧密不可分的 特色:1.适应中文 2.基于最新主流浏览器 */ /* 清除内外边距 */ body, h1, h2, h3, h4, h5, h ...

  2. Security:蠕虫的行为特征描述和工作原理分析

    ________________________ 参考: 百度文库---蠕虫的行为特征描述和工作原理分析 http://wenku.baidu.com/link?url=ygP1SaVE4t4-5fi ...

  3. js 中 字符串的转换

    JS 中将 number 转换为 string 我们比较熟悉,直接用toString() 的方法就可以了:那么将 string 转换成为 number 都有些什么方法呢?如下便简单的列举了一些,以便记 ...

  4. OJ双人赛:程序设计竞赛的新尝试

    早就想在所教的班上组织一次程序设计竞赛,直到冒出双人赛形式的念头.出题.分组.竞赛,又是一次新的尝试. 做为在教学环节中组织的竞赛,不同于自愿报名的竞赛,必须全员参与.享受比赛要追求,培养团队意识也要 ...

  5. servlet 将输入内容通过拼接页面的方式显示出来

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  6. iTextSharp

    iTextSharp 116毫秒处理6G的文件   前言: 有一家印刷企业专为米兰新娘,微微新娘,金夫人这样的影楼印刷婚纱相册.通过一个B2B销售终端软件,把影楼的相片上传到印刷公司的服务器,服务器对 ...

  7. 如何搭建Visual Studio的内核编程开发环境

    最近正在看<寒江独钓——Windows内核安全编程>这本书,感觉这本书非常好,有兴趣的朋友可以买来看看,有关这本书的信息请参考:http://www.china-pub.com/19559 ...

  8. Linux 软件源设置

    版本号:1.0.0-beta 作者:石硕 更新:2014-04-30 15:51:40 ======================================================== ...

  9. MFC常用控件CListCtrl 、CSliderCtrl、CToolTipCtrl、CTreeCtrl的自绘

    Window平台下MFC提供的CListCtrl .CSliderCtrl.CToolTipCtrl.CTreeCtrl等控件大多时候是不能满足我们的需求,如果我要在改变滑动条的颜色,我要改变滑动条的 ...

  10. 为什么出现Wide character in print at a14.pl line 41

    [root@wx03 ~]# cat a14.pl use Net::SMTP; use LWP::UserAgent; use HTTP::Cookies; use HTTP::Headers; u ...