BOJ 4228 哈哈哈
题目链接~~>
做题感悟:这题一看就知道要用状态压缩,本题和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 哈哈哈相关推荐
- 停课不停学,大型网课直播翻车现场合集,你别笑,哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈啊哈...
点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 曾几何时,我们也都有过这样的梦想 就在2020年,因为别人吃了野味,让我这个梦想成真 ...
- 伤疤好了有黑印怎么办_搞笑gif动态图片:“发现相亲对象的闺蜜更有实力,我后悔了”哈哈哈好一个见色起意...
阅读本文前,请您先点击上面的 ,再点击"关注",这样您就可以继续免费收到文章了.每天都有分享,完全是免费订阅,请放心关注. 好姐妹很配合你呀~ 这也许就是刚入职和工作两年的差别 & ...
- 刷题中,效率好低,哈哈哈 -----1.Two Sum
2019独角兽企业重金招聘Python工程师标准>>> 写了三个版本的,第一个版本是javascript使用两个循环,最不烧脑的方法,后面是看答案写出来的,不过也是理解以后,自己写的 ...
- 你知道Material Type(ROH,HALB,FERT…)为什么缩写是ROH,HALB,FERT吗?哈哈哈
你知道Material Type(ROH,HALB,FERT-)为什么缩写是ROH,HALB,FERT吗?哈哈哈 你知道为什么原材料raw materials的Material Type是ROH吗?哈 ...
- 收到了7封拒信的观后感哈哈哈哈哈哈哈哈哈哈
没有录取就没有录取 这个就是人生的过程 反思反思自己还能有什么能力能学习 自己的健康还能怎么做的更加长寿 哈哈哈哈哈哈哈哈哈哈哈哈哈 人生就是一段旅程 珍惜每一次拥有 不要在失去的时候后悔就好
- ctf镜子里面的世界_帮大爷干活,他送了我一只鞋子和一手套,又不能穿拿来做什么?哈哈哈|叶子|镜子|虫子|鞋子|棺材...
"帮大爷干活,他送了我一只鞋子和一手套,又不能穿拿来做什么?"怎么看感觉这都不像是普通的鞋和手套,总感觉好像这位大爷瞒着你什么事儿,一般家里的老人都有几件传家宝,说不定这东西是真的 ...
- 哈哈哈,弟弟被卡桶里了......
1 哈哈哈哈哈弟弟被卡桶里面了 (via.小妮) (注意安全,请勿模仿!) ▼ 2 弟弟是个狠人 ▼ 3 Self-potato: 一种不需要沙发 也能无意义地待着的生活方式 (via.字幕少女) ▼ ...
- 神抓拍!2020搞笑野生动物摄影大赛,哈哈哈哈哈笑到头掉
全世界只有3.14 % 的人关注了 爆炸吧知识 图片来自CWPAs 2020 小动物们到底能有多好玩 让我们来看看今年的 搞笑野生动物摄影大赛吧 保准叫你从头笑到尾 (以下是入围作品) "飚 ...
- 莫队算法 BOJ 2038 [2009国家集训队]小Z的袜子(hose)
题目传送门 1 /* 2 莫队算法:求出[l, r]上取出两只相同袜子的个数. 3 莫队算法是离线处理一类区间不修改查询类问题的算法.如果你知道了[L,R]的答案,可以在O(1)的时间下得到 4 [L ...
最新文章
- iOS学习笔记--01swift实现提示框第三方库:MBProgressHUD
- Leetcode 264. 丑数 II 解题思路及C++实现
- 【CentOS Linux 7】实验7【FTP服务器配置管理】
- Vuex 入门前的小菜 - “Vue 中的简单状态共享机制实现”
- 全球 android手机排行 2013,全球Android手机性能排行 三星Note 3夺魁
- spring 事务管理之只读事务@Transactional(readOnly = true)
- SpreadJS 15.1 ~【SpreadJS 15.0】
- 模COMSOL Multiphysics v5.3 Win64 Linux64 MacOSX64 1DVD
- 【Struts】ActionForm
- 阿拉伯数字转中国人民币大写字符串
- 从python爬虫以及数据可视化的角度来为大家呈现“227事件”后,肖战粉丝的数据图
- CSS3元素闪烁效果
- 初试 Kubernetes 暴漏服务类型之 Nginx Ingress
- 这位博主居然说“我就是看故事也要把这知识学了”
- 解决Python下安装unrar后仍然提示Couldn't find path to unrar library...
- 2021年中国外汇交易情况分析:中国银行结汇金额为16.5万亿元,同比增长17%[图]
- python Matplotlib中时间刻度标签的设置/主副刻度
- 关于手机屏幕的一些知识(2)
- LED格栅灯市场现状及未来发展趋势分析
- 【Python入门教程】第15篇 if条件语句
热门文章
- 世界人口钟实时数据_“人口时钟”今日指向70亿
- 黃埔書院最新原創博文兩篇合集賞析2019年7月22日 星期一
- 比特彗星端口阻塞 虚拟服务器,比特彗星端口阻塞怎么设置 亮黄灯解决方法
- 服务器上的打印机显示已暂停,hp打印机显示已暂停怎么解决
- 宽带客户端下载与安装
- win7打开桌面计算机很慢,5个步骤解决Win7系统电脑软件打开速度慢问题
- Unity3D + luaframework如何做到一键打包
- 使用html实现旋转中心分页功能与速度曲线的修改
- 2023年Q1京东大家电销售数据分析(京东行业大盘销量查询)
- 华为高管认为区块链有助于实现智慧城市