BOJ 4228 哈哈哈

2024-05-29 18:58
文章标签 哈哈哈 boj 4228

本文主要是介绍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 哈哈哈的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1014367

相关文章

快来看,奇葩的年底离职理由,哈哈哈...

点击上方“朱小厮的博客”,选择“设为星标” 后台回复”加群“加入公众号专属技术群 来源:PM圈子(pm1178) 一到年底跳槽季, 大家一定有很多想法吧? 攀到高枝,辞职吧。 薪资太少,辞职吧。 心情不好,辞职吧。 上司不给力,辞职吧。 身体不好,辞职吧。 职场中尔虞我诈太严重,辞职吧。 ...... 但是这些辞职信,你们这样写真的好么? 辞职理由:现在的工作配不上我的梦想。 点评:相

Idea的快捷键,瞎摸索,开心就好,哈哈哈

Idea的快捷键,瞎摸索,开心就好,哈哈哈 前言:如果你有强迫症,换了一个编辑器,最痛苦莫过于快捷键,不顺手了。这里自己瞎摸索的快捷键,贴一下,这里主要以实际应用为主,因为大量介绍的网上已经很多很多,So基本的不再叙述。 分享一下比较不错的Idea快捷键整理网址(出自同一作者):Eclipse vs. IDEA快捷键对比大全  和  十大Intellij IDEA快捷键 和 史上最

工作第四五周 : 博客专家哈哈哈

首先感谢 CSDN 能够授予我“博客专家”的称号,哈哈,虚荣心得到了小小的满足! 这个称号一方面是对我写博客价值的认可,另一方面也代表着对我自身水平的更高要求,需要继续努力才行。 这两周 说来也惭愧,两周前发版加班到3点,第二天就开始感觉身体不舒服。后来又搬了个家,好几天没休息好,就开始牙疼、发烧。去医院检查,原来是休息不好导致免疫力下降,细菌感染导致的冠周炎,还好看得早,不用拔牙。 唉,

boj 11

Description   We are familiar with the game called “Counting 24”. Now it comes a problem that we want to know whether we can figure out the exact answer with given 4 numbers only using +,-,*,/ and (,

boj 342

Descriptionxiaoming实在太好管闲事了.有一天他去参加一个舞会,这里聚集了一大堆帅哥美女,但是舞会却不是那么顺利,虽然帅哥和美女的人数都是相同的,但并不是每一位帅哥都能找到他的舞伴,原因就是有些女生只愿意接受某些男生的邀请.小明为了舞会的顺利进行,xiaoming只好厚着脸皮去和这些女生搭话,了解到了这些女生就都愿意接受哪些男生的邀请,那么剩下的工作就是要小明给这些帅哥美女们搭搭

boj 343

DescriptionTradia最近去了趟超市,采购了好多好吃的东西,其中花花绿绿的巧克力最是诱人。为了感谢Jim前段时间对自己的帮助,Tradia决定把自己的巧克力分一些给Jim。但是Tradia也爱吃巧克力,她不想把自己全部的巧克力都给Jim,而是把巧克力平均分配,使得给Jim的总量和留给自己的总量之差最小。聪明的你能帮助她吗?Input输入包含多组测试数据。首先第一行输入一个数T(T<=

boj 347

DescriptionTradia对数据结构很感兴趣,她懂得很多有用的数据结构,比如链表、二叉树、图等等。最近她在学习堆的有关知识,并对堆能够在log2N的时间复杂度内返回当前集合的最值感到十分的满意。可是我们都知道,Tradia是一个求知欲很强的学生,她并不满足于得到集合的最值(最大、最小值),同时她还想获得集合当前的第K小数,并且要求每次查询的复杂度要与log2N相当,如果复杂度比log2N

matlab 建立 经验模型,记一次哈哈哈哈哈哈的建模经历

这是一篇旧文,但从没在公众号里发过。写于2013年5月7日,记录了我和两位好朋友一起参加清华大学数学建模比赛的故事。当时还是发在qq空间上,这两天正好是新一届的全国赛,好不容易找回qq密码,又把这篇旧文翻出来。真是感慨当时的我写作风格很奔放呢... 把文章在这里重发一次,给大家看看5年前的我参加建模比赛的故事。 自从学完《数学实验》之后便对MATLAB上了瘾,算微分方程解线性规划上天入地无所不能

哈哈哈,又到周一啦!!!不用科研啦!!!

这学期的每周一是我一周中最开心的时间 因为周一有 《行尸走肉》 《西部世界》 《齐木楠雄》 《生活大爆炸》 哈哈哈,好爽,看视频不用科研了 更重要的是 周一不用开会! 哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈!!!