题目:

pid=1429">hdoj 1429 胜利大逃亡(续)

同样题目:

题意:中文的,自己看

分析:题目是求最少的逃亡时间。确定用BFS

这个题目的难点在于有几个锁对于几把钥匙。唯一的相应关系,不能用直接的标记法,由于一个图可能须要搜索多次。

细致分析的话会发现。图的搜索次数是和钥匙的出现次数相关,那么我们能够用二进制的0 和 1 来表示第几把钥匙出现过没有。所以我们能够用状态压缩来标记那个钥匙出现过,然后用三维标记,第三维表示出现几个钥匙了的情况下图的点的搜索情况。其它就和简单的一样。

AC代码:

  1. #include <cstdio>
  2. #include<iostream>
  3. #include <queue>
  4. #include <cstring>
  5. using namespace std;
  6. const int N = 25;
  7. char map[N][N];
  8. int vis[N][N][1<<11];
  9. struct Node
  10. {
  11. int x,y,step;
  12. int key;
  13. };
  14. int dx[6]={0,0,1,-1};
  15. int dy[6]={1,-1,0,0};
  16. int m,n,t;
  17. int BFS(Node st,Node en)
  18. {
  19. memset(vis,0,sizeof(vis));
  20. st.step = 0;st.key=0;
  21. queue<Node> q;
  22. q.push(st);
  23. Node tmp1,tmp2;
  24. while(!q.empty())
  25. {
  26. tmp1 = q.front();
  27. q.pop();
  28. if(tmp1.x==en.x && tmp1.y==en.y)
  29. return tmp1.step;
  30. for(int i=0;i<4;i++)
  31. {
  32. tmp2.x=tmp1.x+dx[i];
  33. tmp2.y=tmp1.y+dy[i];
  34. tmp2.step = tmp1.step+1;
  35. tmp2.key = tmp1.key;
  36. if(map[tmp2.x][tmp2.y]>='a' && map[tmp2.x][tmp2.y]<='j')
  37. tmp2.key = tmp2.key|(1<<(map[tmp2.x][tmp2.y]-'a'));
  38. if(map[tmp2.x][tmp2.y]=='*' || tmp2.step>=t)
  39. continue;
  40. if(vis[tmp2.x][tmp2.y][tmp2.key]==0 && tmp2.x>=1 && tmp2.y>=1 && tmp2.x<=m && tmp2.y<=n)
  41. {
  42. vis[tmp2.x][tmp2.y][tmp2.key]=1;
  43. if(map[tmp2.x][tmp2.y]>='A' && map[tmp2.x][tmp2.y]<='J')
  44. {
  45. if(tmp2.key&(1<<map[tmp2.x][tmp2.y]-'A'))
  46. q.push(tmp2);
  47. }
  48. else
  49. q.push(tmp2);
  50. }
  51. }
  52. }
  53. return -1;
  54. }
  55. int main()
  56. {
  57. //freopen("Input.txt","r",stdin);
  58. while(~scanf("%d%d%d",&m,&n,&t))
  59. {
  60. Node st,en;
  61. for(int i=1;i<=m;i++)
  62. {
  63. getchar();
  64. for(int j=1;j<=n;j++){
  65. scanf("%c",&map[i][j]);
  66. if(map[i][j]=='@')
  67. st.x=i,st.y=j;
  68. if(map[i][j]=='^')
  69. en.x=i,en.y=j;
  70. }
  71. }
  72. int ans=BFS(st,en);
  73. if(ans<t)
  74. printf("%d\n",ans);
  75. else
  76. puts("-1");
  77. }
  78. return 0;
  79. }

hdoj 1429 胜利大逃亡(续) 【BFS+状态压缩】的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. HDOJ 1429 胜利大逃亡(续)

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

  8. HDU 1429 胜利大逃亡(续)(bfs+状态压缩,很经典)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)  ...

  9. hdu 1429 胜利大逃亡(续)

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王 ...

随机推荐

  1. linux rar 解压忽略带密码压缩包

    #解压忽略密码 rar x -p- file.rar #解压忽略子目录 rar x -ep file.rar

  2. H5图片上传、压缩

    1.注册input file标签的onchange事件: 2.检查图片格式: 3.检查图片大小: 4.压缩图片 5.上传图片至服务器: 前端代码: document.getElementById('i ...

  3. SparkSql初级编程实践

    1.Spark SQL 基本操作将下列 JSON 格式数据复制到 Linux 系统中,并保存命名为 employee.json.{ "id":1 , "name" ...

  4. vue父组件引用子组件方法显示undefined问题原因及解决方法

    关于vue父组件引用子组件问题 1.首先导入子组件并且在components中定义子组件 2.引用子组件,并定义ref,ref定义的名称用于 this.$refs所调用的名称 3.调用子组件的方法 ( ...

  5. 2015 Multi-University Training Contest 4 hdu 5334 Virtual Participation

    Virtual Participation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Ot ...

  6. js获取当地时间并且拼接时间格式的三种方式

    js获取当地时间并且拼接时间格式,在stackoverflow上有人在问,查了资料,各种方法将时间格式改成任意自己想要的样式. 1. var date = new Date(+new Date()+8 ...

  7. 极路由4pro(HC5962)设置阿里云DDNS

    v2ex有个帖子说用Dnspod的API可以一行搞定,不过我既然买的是阿里云的域名还是想尽量用阿里云的API,感觉比较安全,另外修改解析记录后也会自动发邮件通知,所以还是调用阿里云的API吧.阿里云的 ...

  8. shadowOffset 具体解释

    x向右为正,y向下为正 1.y<0 UILabel *label=[[UILabelalloc] initWithFrame:CGRectMake(40,40, 250,50)]; label. ...

  9. HTTP Status 404 - /servlet/Item/AddItemServlet

    我想学习编程的人对404和500都是非常敏感非常熟悉的.在做DRP系统的时候多次遇到这两个错误,今天让我遇到他并且让我铭记他,那就是一个"/": 这是说jsp出问题了,并且找不到, ...

  10. dom 编程(html和xml)

    html dom与xml dom关系: 什么是 DOM? DOM 是 W3C(万维网联盟)的标准. DOM 定义了訪问 HTML 和 XML 文档的标准: "W3C 文档对象模型 (DOM) ...