HDU 4771 BFS + 状压
Stealing Harry Potter's Precious
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1343 Accepted Submission(s): 642

题意和题解转自:http://blog.csdn.net/qq574857122/article/details/14649319
题意:
给定n*m的地图
#为墙 @为起点
下面K个坐标
问:遍历K个给定坐标,需要的最小步数
思路:
因为K 最大只有4
状压 当前是否走过某点
用二进制 的 i 位 0、1表示 第i个点是否走过
- #include<iostream>
- #include<cstring>
- #include<cstdlib>
- #include<cstdio>
- #include<algorithm>
- #include<cmath>
- #include<queue>
- #include<map>
- #include<string>
- #define N 105
- #define M 15
- #define mod 10000007
- //#define p 10000007
- #define mod2 100000000
- #define ll long long
- #define LL long long
- #define maxi(a,b) (a)>(b)? (a) : (b)
- #define mini(a,b) (a)<(b)? (a) : (b)
- using namespace std;
- int ans;
- int n,m;
- int k;
- char s[N][N];
- int a[N][N];
- int mi[][N][N];
- int dirx[]={,,-,};
- int diry[]={,,,-};
- typedef struct
- {
- int x;
- int y;
- int step;
- int st;
- }PP;
- PP start;
- void ini()
- {
- ans=-;
- int i,j,p;
- int x,y;
- for(i=;i<n;i++){
- scanf("%s",s[i]);
- }
- memset(a,,sizeof(a));
- scanf("%d",&k);
- for(i=;i<n;i++){
- for(j=;j<m;j++){
- for(p=;p<(<<k);p++){
- mi[p][i][j]=;
- }
- if(s[i][j]=='@'){
- start.x=i;
- start.y=j;
- start.st=;
- start.step=;
- }
- if(s[i][j]=='#'){
- a[i][j]=-;
- }
- }
- }
- for(i=;i<k;i++){
- scanf("%d%d",&x,&y);
- a[x-][y-]=(<<i);
- if(x-==start.x && y-==start.y){
- start.st+=(<<i);
- mi[start.st][start.x][start.y]=;
- }
- }
- if(start.st==){
- mi[][start.x][start.y]=;
- }
- // for(i=0;i<n;i++){
- // for(j=0;j<m;j++){
- // printf(" %d",a[i][j]);
- // }printf("\n");
- // }
- }
- int ok(int i,int j)
- {
- if(i>= && i<n && j>= && j<m && a[i][j]!=-){
- return ;
- }
- return ;
- }
- void solve()
- {
- int i;
- PP now,nx;
- queue<PP> q;
- q.push(start);
- while(q.size()>=)
- {
- now=q.front();
- // printf(" i=%d j=%d st=%d step=%d\n",now.x,now.y,now.st,now.step);
- q.pop();
- if(now.st== ((<<k)-) ){
- ans=now.step;return;
- }
- for(i=;i<;i++){
- nx=now;
- nx.step++;
- nx.x=now.x+dirx[i];
- nx.y=now.y+diry[i];
- if(ok(nx.x,nx.y)==) continue;
- if( (now.st & a[nx.x][nx.y])==){
- nx.st=(now.st ^ a[nx.x][nx.y]);
- // printf(" %d %d %d\n",now.st, a[nx.x][nx.y],nx.st);
- //q.push(nx);
- // mi[nx.st][nx.x][nx.y]=min(nx.step,mi[nx.st][nx.x][nx.y]);
- }
- //else{
- if( nx.step< mi[nx.st][nx.x][nx.y]){
- q.push(nx);
- mi[nx.st][nx.x][nx.y]=nx.step;
- }
- // }
- }
- }
- }
- void out()
- {
- printf("%d\n",ans);
- }
- int main()
- {
- //freopen("data.in","r",stdin);
- //freopen("data.out","w",stdout);
- //scanf("%d",&T);
- // for(int ccnt=1;ccnt<=T;ccnt++)
- // while(T--)
- while(scanf("%d%d",&n,&m)!=EOF)
- {
- if(n== && m== ) break;
- //printf("Case %d: ",ccnt);
- ini();
- solve();
- out();
- }
- return ;
- }
HDU 4771 BFS + 状压的更多相关文章
- hdu 2209 bfs+状压
http://acm.hdu.edu.cn/showproblem.php?pid=2209 不知为啥有种直觉.会出状压+搜索的题,刷几道先 简单的BFS.状压表示牌的状态, //#pragma co ...
- hdu 5025 bfs+状压
http://acm.hdu.edu.cn/showproblem.php?pid=5025 N*N矩阵 M个钥匙 K起点,T终点,S点需多花费1点且只需要一次,1-9表示9把钥匙,只有当前有I号钥匙 ...
- hdu 1429 bfs+状压
题意:这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方.刚开始 Ignatius被关在(sx,sy)的位置,离开地牢的门 ...
- C - 小明系列故事――捉迷藏 HDU - 4528 bfs +状压 旅游-- 最短路+状压
C - 小明系列故事――捉迷藏 HDU - 4528 这个题目看了一下题解,感觉没有很难,应该是可以自己敲出来的,感觉自己好蠢... 这个是一个bfs 用bfs就很好写了,首先可以预处理出大明和二明能 ...
- hdu 1044(bfs+状压)
非常经典的一类题型 没有多个出口.这里题目没有说清楚 Collect More Jewels Time Limit: 2000/1000 MS (Java/Others) Memory Limi ...
- hdu 4771 Stealing Harry Potter's Precious (BFS+状压)
题意: n*m的迷宫,有一些格能走("."),有一些格不能走("#").起始点为"@". 有K个物体.(K<=4),每个物体都是放在& ...
- hdu 5094 Maze (BFS+状压)
题意: n*m的迷宫.多多要从(1,1)到达(n,m).每移动一步消耗1秒.有P种钥匙. 有K个门或墙.给出K个信息:x1,y1,x2,y2,gi 含义是(x1,y1)与(x2,y2)之间有gi ...
- 孤岛营救问题 (BFS+状压)
https://loj.ac/problem/6121 BFS + 状压 写过就好想,注意细节debug #include <bits/stdc++.h> #define read rea ...
- 【HDU 4771 Stealing Harry Potter's Precious】BFS+状压
2013杭州区域赛现场赛二水... 类似“胜利大逃亡”的搜索问题,有若干个宝藏分布在不同位置,问从起点遍历过所有k个宝藏的最短时间. 思路就是,从起点出发,搜索到最近的一个宝藏,然后以这个位置为起点, ...
随机推荐
- iview 验证 trigger: 'blur,change', 同时加两个,省的每次还想input 还是 select
iview 验证 trigger: 'blur,change', 同时加两个,省的每次还想input 还是 select dataRuleValidate: { name: [{ required: ...
- 关于 QObject 类
1.QObject类 简述 QObject类是所有Qt对象的基类. QObject是Qt对象模型的核心. 该模型的核心特征是称为信号和槽的对象通信机制. 您可以使用connect()将信号连接到槽 ...
- python爬虫---实现项目(三) Selenium分析美团美食
上一期博客,我本来想爬取美团美食的,但是由于请求头太复杂,没有破解开其中的几个参数,所以放弃,这次我们来用selenium来模式浏览器抓取数据,我们先来简单看一下流程: 1,利用selenium驱动浏 ...
- grep-sed命令用法:
用户切换 su username:非登录式切换 su - username:登录式切换 su -l username:登录式切换 su username -c COMMAND echo -n ...
- [九省联考2018] IIIDX 线段树+贪心
题目: 给出 k 和 n 个数,构造一个序列使得 d[i]>=d[i/k] ,并且字典序最大. 分析: 听说,当年省选的时候,这道题挡住了大批的高手,看上去十分简单,实际上那道弯段时间内是转不过 ...
- MySQLfailover错误一则
由于公司现有主库要转移到新的主库上,所以,我打算利用MySQLfailover工具的故障转移. 1.开发把程序账号转移到新主库上 2.停止现有主库,使之进行故障转移,转移期间会自动锁表,保持数据一致性 ...
- 如何用纯 CSS 创作一盘传统蚊香
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/BVpvMz 可交互视频教 ...
- H5移动端触摸事件:touchstart、touchend、touchmove
第一部分代码事例: <html><head> <meta charset="utf-8"> <style> #main,#main1 ...
- PERL学习之模式匹配
一.简介 模式指在字符串中寻找的特定序列的字符,由反斜线包含:/def/即模式def.其用法如结合函数split将字符串用某模式分成多个单词:@array = split(/ /, $line); ...
- 【css】【动画】【转发】旋转动画
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <s ...