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
Some rooms are indestructible and some rooms are vulnerable. Goblins always care more about their own safety than their customers' properties, so they live in the indestructible rooms and put customers' properties in vulnerable rooms. Harry Potter's precious are also put in some vulnerable rooms. Dudely wants to steal Harry's things this holiday. He gets the most advanced drilling machine from his father, uncle Vernon, and drills into the bank. But he can only pass though the vulnerable rooms. He can't access the indestructible rooms. He starts from a certain vulnerable room, and then moves in four directions: north, east, south and west. Dudely knows where Harry's precious are. He wants to collect all Harry's precious by as less steps as possible. Moving from one room to another adjacent room is called a 'step'. Dudely doesn't want to get out of the bank before he collects all Harry's things. Dudely is stupid.He pay you $1,000,000 to figure out at least how many steps he must take to get all Harry's precious.题意和题解转自: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个宝藏的最短时间. 思路就是,从起点出发,搜索到最近的一个宝藏,然后以这个位置为起点, ...
随机推荐
- URAL 2047 Maths (数学)
对于一个数来说,它的除数是确定的,那么它的前驱也是确定的,而起点只能是1或2,所以只要类似筛法先预处理出每个数的除数个数 ,然后递推出每个数往前的延伸的链长,更新最大长度,记录对应数字.找到maxn以 ...
- RLock(递归锁)
import threading, time def run1(): print("grab the first part data") lock.acquire()#进入大门后的 ...
- Linux文件操作函数
creat() 函数 close() 函数 read() 函数 read 函数实际读到的字节数少于要求读的字节数时: 读普通文件,在读到要求字节数之前就到达文件尾: 当从终端设备读,通常一次最多读一行 ...
- Android Studio 中安装 apk 被拆分成多个 slice,如何禁止?
Android Studio 3.0.1 中,Run 'app' 时,生成的 apk 被分割成多个 slice: $ adb install-multiple -r D:\...\app\build\ ...
- Android 使用 adb命令 远程安装apk
Android 使用 adb命令 远程安装apk ./adb devices 列出所有设备 ./adb connect 192.168.1.89 连接到该设备 ./adb logcat 启动logca ...
- shell脚本,awk常见初始化变量的题目。
文件 内容如下 clone=line1gb=line1gi=line1lib=line1gb=line2gi=line2lib=line2clone=line3gb=line3gi=line3lib= ...
- 【计数】51nod1677 treecnt
要将答案看做是小问题的贡献和 Description 给定一棵n个节点的树,从1到n标号.选择k个点,你需要选择一些边使得这k个点通过选择的边联通,目标是使得选择的边数最少. 现需要计算对于所有选择k ...
- python中的decorator的作用
1.概念 装饰器(decorator)就是:定义了一个函数,想在运行时动态增加功能,又不想改动函数本身的代码.可以起到复用代码的功能,避免每个函数重复性编写代码,简言之就是拓展原来函数功能的一种函数. ...
- (59)zabbix拓扑图展示链路状况Link indicators
Link indicators介绍 上一篇已经了解了如何配置zabbix map,也提到了如何连接两个map元素,这节我们来讲两个map元素之间的链路指示配置. 我们需要在链路上配置trigger,如 ...
- centos7 parted 扩容
(系统:vmware上的centos7.4 ,使用工具:parted分区命令.) 最近发现磁盘不够用了,需要加点.## WARNING ! 下面是实验过程,不代表生产环境.若有重要数据请操作前备份. ...