http://acm.hdu.edu.cn/showproblem.php?pid=1429

  1. #include <stdio.h>
  2. #include <queue>
  3. #include <string.h>
  4. using namespace std;
  5. struct node
  6. {
  7. int x,y;
  8. int state;
  9. int step;
  10. } s,t;
  11. int Time,n,m;
  12. int s_x,s_y,e_x,e_y;
  13. char a[][];
  14. int vis[][][];//标记状态
  15. int dir[][] = {{,},{-,},{,-},{,}};
  16. void bfs()
  17. {
  18. memset(vis,,sizeof(vis));
  19. queue<node>q;
  20. s.x = s_x;
  21. s.y = s_y;
  22. s.state = ;
  23. s.step = ;
  24. q.push(s);
  25. vis[s_x][s_y][s.state] = ;
  26. while(!q.empty())
  27. {
  28. t = q.front();
  29. q.pop();
  30. int x = t.x;
  31. int y = t.y;
  32. if (x==e_x&&y==e_y)
  33. {
  34. Time = t.step;
  35. return ;
  36. }
  37. for (int i = ; i < ; i++)
  38. {
  39. int dx = x+dir[i][];
  40. int dy = y+dir[i][];
  41.  
  42. if (dx>=&&dx<n && dy>=&&dy<m && (!vis[dx][dy][t.state]) && a[dx][dy]!='*')
  43. {
  44. if (a[dx][dy]=='.'||a[dx][dy]=='^'||a[dx][dy]=='@')
  45. {
  46. vis[dx][dy][t.state] = ;
  47. s.x = dx;
  48. s.y = dy;
  49. s.step=t.step+;
  50. s.state = t.state;
  51. q.push(s);
  52.  
  53. }
  54. else if (a[dx][dy]>='A' && a[dx][dy]<='J')
  55. {
  56. if ((<<(a[dx][dy]-'A'))&t.state)//判断是否拿到过能打开当前门的钥匙
  57. {
  58. vis[dx][dy][t.state] = ;
  59. s.x = dx;
  60. s.y = dy;
  61. s.step = t.step+;
  62. s.state = t.state;
  63. q.push(s);
  64. }
  65. }
  66. else if (a[dx][dy]>='a' && a[dx][dy] <= 'j')
  67. {
  68. int state= ((<<(a[dx][dy]-'a'))|t.state);//更新此时拿到的钥匙的状态
  69. if (!vis[dx][dy][state])
  70. {
  71. vis[dx][dy][state] = ;
  72. s.x = dx;
  73. s.y = dy;
  74. s.step = t.step+;
  75. s.state = state;
  76. q.push(s);
  77. }
  78.  
  79. }
  80. }
  81. }
  82. }
  83. }
  84. int main()
  85. {
  86. int t;
  87. while(~scanf("%d%d%d%*c",&n,&m,&t))
  88. {
  89. Time = -;
  90. for (int i = ; i < n; i++)
  91. scanf("%s",a[i]);
  92. for (int i = ; i < n; i++)
  93. {
  94. for (int j = ; j < m; j++)
  95. {
  96. if (a[i][j]=='@')
  97. {
  98. s_x = i;
  99. s_y = j;
  100. }
  101. if (a[i][j]=='^')
  102. {
  103. e_x = i;
  104. e_y = j;
  105. }
  106. }
  107. }
  108. bfs();
  109. if (Time < t && Time!=-)
  110. printf("%d\n",Time);
  111. else
  112. printf("-1\n");
  113. }
  114. return ;
  115. }

胜利大逃亡(续)(bfs)的更多相关文章

  1. hdu.1429.胜利大逃亡(续)(bfs + 0101011110)

    胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  2. hdu 1429 胜利大逃亡(续)(bfs+位压缩)

    胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  3. hdu 1429 胜利大逃亡(续) (bfs+状态压缩)

    又开始刷题了 题意:略过. 分析:主要是确定状态量,除了坐标(x,y)之外,还有一个key状态,就好比手上拿着一串钥匙.状态可以用位运算来表示:key&(x,y)表示判断有没有这扇门的钥匙,k ...

  4. HDOJ 1429 胜利大逃亡(续) (bfs+状态压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1429 思路分析:题目要求找出最短的逃亡路径,但是与一般的问题不同,该问题增加了门与钥匙约束条件: 考虑 ...

  5. hdu_1429_胜利大逃亡(续)(BFS状压)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1429 题意:迷宫的加强版,迷宫里有钥匙和门,问在指定的时间下能否逃出 题解:用二进制位来记录是否有该门 ...

  6. hdu - 1429 胜利大逃亡(续) (bfs状态压缩)

    http://acm.hdu.edu.cn/showproblem.php?pid=1429 终于开始能够做状态压缩的题了,虽然这只是状态压缩里面一道很简单的题. 状态压缩就是用二进制的思想来表示状态 ...

  7. 胜利大逃亡(续)(状态压缩bfs)

    胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  8. 胜利大逃亡(续)(bfs+状态压缩)

    胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  9. 胜利大逃亡(续)hdu1429(bfs)

    胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

随机推荐

  1. 预处理、const、static、sizeof

    1.预处理和宏定义 #define xxxx #ifdef xxxx ; #elseif xxxx; #endif 2.c++求随机数 rand(),rand()会返回一随机数值, 范围在0至RAND ...

  2. shell脚本网络流量实时查看

    Linux网络流量实时查看脚本,Centos默认没有自带流量查看工具,通过网上的资料做了一些修改 #!/bin/bash # Author: Ca0gu0 # Script Name: idev.sh ...

  3. day11-函数对象、名称空间和作用域

    目录 函数对象 函数的嵌套 名称空间和作用域 内置名称空间 全局名称空间 局部名称空间 作用域 全局作用域 局部作用域 global和nonlocal 函数对象 在Python中,一切皆对象,函数也是 ...

  4. Photoshop如何实现图片相对画布居中

    先按ctrl+A,再选择要居中的图层,然后就会发现居中按钮被激活了

  5. 2.1.5、SparkEnv中创建MapOutputTracker

    SparkEnv中创建MapOutputTracker def registerOrLookupEndpoint( name: String, endpointCreator: => RpcEn ...

  6. CSVHelper在Asp.Net MVC中的使用

    1,从数据库读取数据,然后导出CSV文件 [HttpPost] public FileResult ExportCSV() { var apps =....//linq以及EF从数据库查询数据 Mem ...

  7. 循环A表,根据查询结果,更新A表字段

    create or replace procedure prc_user_xtzx_match(p_flag out varchar2) IS xingming_match_loginname ); ...

  8. MYSQL 运维

    http://www.eimhe.com/thread-142990-1-1.html http://www.eimhe.com/search.php?mod=forum&searchid=6 ...

  9. MVC.Net:添加第三方类库的bundles引用

    以jQuery Mobile为例.当我们用nuget添加jQuery Mobile的package后,需要在项目中引用jQuery Mobile.传统的做法是在html页面上添加 <link h ...

  10. 多校第六场 1003 hdu 5355 Cake(贪心)

    题目链接:(数据加强后wa了) hdu 5355 题目大意: 给出一个蛋糕.切成1~n大小的n块.问是否能在不继续分割的情况下拼凑出m等份. 题目分析: 首先我们是可以知道每份蛋糕的尺寸的,利用n*( ...