题目链接~~>

做题感悟:这题一看就知道要用状态压缩,本题和HDU 1429 胜利大逃亡(续)差不多。

解题思路:你可以把宝物压缩为二进制,例如:01001 代表你已经拿过 1 号和 4 号宝物了 0 代表相应的宝物没拿。用同样的方法把拿某个物品的前提条件也映射成二进制。假如你现在遇到 3 号宝物,如果3号宝物的前提条件是拿到 1 号 和 4 号宝物才能拿 3 号,那么前提条件可以用二进制表示为 :01001  那么只要将这个二进制与你当前的 key 相与如果结果还是等于前提条件的二进制,表示前提条件已经满足。so 3 号物品可以取走(前提是没取过三号物品),否则不可以。

代码:

#include<stdio.h>
#include<iostream>
#include<map>
#include<stack>
#include<string>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std ;
#define LEN sizeof(struct node)
#define lld long long int
const double PI = 3.1415926 ;
const double INF = 99999999 ;
const int MX =25 ;
int n,m,mx ;
char s[MX][MX] ;
int b[MX] ;
int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1} ;
bool vis[MX][MX][MX] ;// 标记数组
struct node
{int x,y,key,step ;
} ;
bool search(int x,int y) // 判断是否出界
{if(x<0||y<0||x>=n||y>=m||s[x][y]=='#')return false ;return true ;
}
int bfs(int x,int y)
{int key,sx,sy,temp ;memset(vis,false,sizeof(vis)) ;queue<node>q ;node curt,next ;curt.x=x ;curt.y=y ;curt.key=0 ;curt.step=0 ;vis[x][y][0]=true ;q.push(curt) ;while(!q.empty()){curt=q.front() ;q.pop() ;if(curt.key==(1<<mx)-1&&s[curt.x][curt.y]=='E')return curt.step ;for(int i=0 ;i<4 ;i++){next.x=sx=curt.x+dx[i] ;next.y=sy=curt.y+dy[i] ;next.step=curt.step+1 ;next.key=key=curt.key ;if(search(sx,sy)) // 判断是否出界{if(s[sx][sy]>='0'&&s[sx][sy]<='9') // 是宝藏{temp=s[sx][sy]-'0' ;if(key&(1<<temp)) // 已经取过{if(!vis[sx][sy][key]){vis[sx][sy][key]=true ;next.key=key ;q.push(next) ;}}else  // 还没取过{temp=s[sx][sy]-'0' ;if((key&b[temp])==b[temp])// 取该宝物的前提条件已经满足{next.key=key|(1<<temp) ;vis[sx][sy][next.key]=true ;q.push(next) ;}else if(!vis[sx][sy][key])// 前提条件没满足{vis[sx][sy][key]=true ;next.key=key ;q.push(next) ;}}}else if(!vis[sx][sy][key])// 不是宝藏{next.key=key ;vis[sx][sy][key]=true ;q.push(next) ;}}}}return -1 ;
}
int main()
{int sx,sy ;while(~scanf("%d%d",&n,&m)){for(int i=0 ;i<n ;i++){scanf("%s",s[i]) ;for(int j=0 ;j<m ;j++)if(s[i][j]=='S'){sx=i ;sy=j ;}else if(s[i][j]>='0'&&s[i][j]<='9')mx++ ;}int nx,ans=0,y ;for(int i=0 ;i<mx ;i++){scanf("%d",&nx) ;ans=0 ;for(int j=0 ;j<nx ;j++){scanf("%d",&y) ;ans=ans|(1<<y) ;}b[i]=ans ;// 取第 i 个宝物的前提条件}int an=bfs(sx,sy) ;if(an!=-1)printf("%d\n",an) ;else    printf("Impossible\n") ;}return 0 ;
}

BOJ 4228 哈哈哈相关推荐

  1. 停课不停学,大型网课直播翻车现场合集,你别笑,哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈啊哈...

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 曾几何时,我们也都有过这样的梦想 就在2020年,因为别人吃了野味,让我这个梦想成真 ...

  2. 伤疤好了有黑印怎么办_搞笑gif动态图片:“发现相亲对象的闺蜜更有实力,我后悔了”哈哈哈好一个见色起意...

    阅读本文前,请您先点击上面的 ,再点击"关注",这样您就可以继续免费收到文章了.每天都有分享,完全是免费订阅,请放心关注. 好姐妹很配合你呀~ 这也许就是刚入职和工作两年的差别 & ...

  3. 刷题中,效率好低,哈哈哈 -----1.Two Sum

    2019独角兽企业重金招聘Python工程师标准>>> 写了三个版本的,第一个版本是javascript使用两个循环,最不烧脑的方法,后面是看答案写出来的,不过也是理解以后,自己写的 ...

  4. 你知道Material Type(ROH,HALB,FERT…)为什么缩写是ROH,HALB,FERT吗?哈哈哈

    你知道Material Type(ROH,HALB,FERT-)为什么缩写是ROH,HALB,FERT吗?哈哈哈 你知道为什么原材料raw materials的Material Type是ROH吗?哈 ...

  5. 收到了7封拒信的观后感哈哈哈哈哈哈哈哈哈哈

    没有录取就没有录取 这个就是人生的过程 反思反思自己还能有什么能力能学习 自己的健康还能怎么做的更加长寿 哈哈哈哈哈哈哈哈哈哈哈哈哈 人生就是一段旅程 珍惜每一次拥有 不要在失去的时候后悔就好

  6. ctf镜子里面的世界_帮大爷干活,他送了我一只鞋子和一手套,又不能穿拿来做什么?哈哈哈|叶子|镜子|虫子|鞋子|棺材...

    "帮大爷干活,他送了我一只鞋子和一手套,又不能穿拿来做什么?"怎么看感觉这都不像是普通的鞋和手套,总感觉好像这位大爷瞒着你什么事儿,一般家里的老人都有几件传家宝,说不定这东西是真的 ...

  7. 哈哈哈,弟弟被卡桶里了......

    1 哈哈哈哈哈弟弟被卡桶里面了 (via.小妮) (注意安全,请勿模仿!) ▼ 2 弟弟是个狠人 ▼ 3 Self-potato: 一种不需要沙发 也能无意义地待着的生活方式 (via.字幕少女) ▼ ...

  8. 神抓拍!2020搞笑野生动物摄影大赛,哈哈哈哈哈笑到头掉

    全世界只有3.14 % 的人关注了 爆炸吧知识 图片来自CWPAs 2020 小动物们到底能有多好玩 让我们来看看今年的 搞笑野生动物摄影大赛吧 保准叫你从头笑到尾 (以下是入围作品) "飚 ...

  9. 莫队算法 BOJ 2038 [2009国家集训队]小Z的袜子(hose)

    题目传送门 1 /* 2 莫队算法:求出[l, r]上取出两只相同袜子的个数. 3 莫队算法是离线处理一类区间不修改查询类问题的算法.如果你知道了[L,R]的答案,可以在O(1)的时间下得到 4 [L ...

最新文章

  1. iOS学习笔记--01swift实现提示框第三方库:MBProgressHUD
  2. Leetcode 264. 丑数 II 解题思路及C++实现
  3. 【CentOS Linux 7】实验7【FTP服务器配置管理】
  4. Vuex 入门前的小菜 - “Vue 中的简单状态共享机制实现”
  5. 全球 android手机排行 2013,全球Android手机性能排行 三星Note 3夺魁
  6. spring 事务管理之只读事务@Transactional(readOnly = true)
  7. SpreadJS 15.1 ~【SpreadJS 15.0】
  8. 模COMSOL Multiphysics v5.3 Win64 Linux64 MacOSX64 1DVD
  9. 【Struts】ActionForm
  10. 阿拉伯数字转中国人民币大写字符串
  11. 从python爬虫以及数据可视化的角度来为大家呈现“227事件”后,肖战粉丝的数据图
  12. CSS3元素闪烁效果
  13. 初试 Kubernetes 暴漏服务类型之 Nginx Ingress
  14. 这位博主居然说“我就是看故事也要把这知识学了”
  15. 解决Python下安装unrar后仍然提示Couldn't find path to unrar library...
  16. 2021年中国外汇交易情况分析:中国银行结汇金额为16.5万亿元,同比增长17%[图]
  17. python Matplotlib中时间刻度标签的设置/主副刻度
  18. 关于手机屏幕的一些知识(2)
  19. LED格栅灯市场现状及未来发展趋势分析
  20. 【Python入门教程】第15篇 if条件语句

热门文章

  1. 世界人口钟实时数据_“人口时钟”今日指向70亿
  2. 黃埔書院最新原創博文兩篇合集賞析2019年7月22日 星期一
  3. 比特彗星端口阻塞 虚拟服务器,比特彗星端口阻塞怎么设置 亮黄灯解决方法
  4. 服务器上的打印机显示已暂停,hp打印机显示已暂停怎么解决
  5. 宽带客户端下载与安装
  6. win7打开桌面计算机很慢,5个步骤解决Win7系统电脑软件打开速度慢问题
  7. Unity3D + luaframework如何做到一键打包
  8. 使用html实现旋转中心分页功能与速度曲线的修改
  9. 2023年Q1京东大家电销售数据分析(京东行业大盘销量查询)
  10. 华为高管认为区块链有助于实现智慧城市