博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdoj 1429 胜利大逃亡(续) 【BFS+状态压缩】
阅读量:6494 次
发布时间:2019-06-24

本文共 1439 字,大约阅读时间需要 4 分钟。

题目:

同样题目:

题意:中文的,自己看

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

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

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

AC代码:

#include 
#include
#include
#include
using namespace std;const int N = 25;char map[N][N];int vis[N][N][1<<11];struct Node{ int x,y,step; int key;};int dx[6]={0,0,1,-1};int dy[6]={1,-1,0,0};int m,n,t;int BFS(Node st,Node en){ memset(vis,0,sizeof(vis)); st.step = 0;st.key=0; queue
q; q.push(st); Node tmp1,tmp2; while(!q.empty()) { tmp1 = q.front(); q.pop(); if(tmp1.x==en.x && tmp1.y==en.y) return tmp1.step; for(int i=0;i<4;i++) { tmp2.x=tmp1.x+dx[i]; tmp2.y=tmp1.y+dy[i]; tmp2.step = tmp1.step+1; tmp2.key = tmp1.key; if(map[tmp2.x][tmp2.y]>='a' && map[tmp2.x][tmp2.y]<='j') tmp2.key = tmp2.key|(1<<(map[tmp2.x][tmp2.y]-'a')); if(map[tmp2.x][tmp2.y]=='*' || tmp2.step>=t) continue; if(vis[tmp2.x][tmp2.y][tmp2.key]==0 && tmp2.x>=1 && tmp2.y>=1 && tmp2.x<=m && tmp2.y<=n) { vis[tmp2.x][tmp2.y][tmp2.key]=1; if(map[tmp2.x][tmp2.y]>='A' && map[tmp2.x][tmp2.y]<='J') { if(tmp2.key&(1<

转载地址:http://tfuyo.baihongyu.com/

你可能感兴趣的文章
阳台的青椒苗
查看>>
swapper进程【转】
查看>>
python笔记21-列表生成式
查看>>
关于解决sql2012编辑器对象名无效问题
查看>>
跨链技术与通证经济
查看>>
[SignalR2] 认证和授权
查看>>
爬虫学习之-xpath
查看>>
js jQuery 右键菜单 清屏
查看>>
深入理解let和var的区别(暂时性死区)!!!
查看>>
dotConnect for Oracle
查看>>
Android开发需要的知识
查看>>
从零开始iOS8编程【iOS开发常用控件】
查看>>
我的友情链接
查看>>
软链接、硬链接
查看>>
详解linux vi命令用法
查看>>
mysql中执行shell命令
查看>>
Eclipse下C/C++开发环境搭建
查看>>
Eclipse中设置在创建新类时自动生成注释
查看>>
我的友情链接
查看>>
CoreOS 手动更新
查看>>