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个宝藏的最短时间. 思路就是,从起点出发,搜索到最近的一个宝藏,然后以这个位置为起点, ...
随机推荐
- glob - 形成路径名称
描述 (DESCRIPTION) 很久以前 在 UNIX V6 版 中 有一个 程序 /etc/glob 用来 展开 通配符模板. 不久以后 它 成为 shell 内建功能. 现在 人们 开发了 类似 ...
- ucosii(2.89) 在Lpc1765移植中定时器的使用。
1,lpc1765的systicker register是24bit, cpu 频率64Mhz时候,注意不要设置systicker 的值超过24bit. 2, 使用timer 的callback函数, ...
- Sublime Text 套件介紹(四):Pretty JSON
JSON,一個輕量級的資料交換語言,目前許多網站AJAX request的回應結果都是JSON格式 以下是一個標準的JSON格式 { "firstName": " ...
- 2019的hdu暑假作业(欢迎纠错)
1219 遍历计数. #include<bits/stdc++.h> #define QAQ 0 using namespace std; ]; ]; int main(){ )){ me ...
- Java截取视频文件缩略图
/** * 截取视频第0帧的图片 */public static void videoImage(String filePath, String fileName,int widthdist, int ...
- Js自学学习-笔记6-8
<!-- 第6-7课笔记 --> <!-- for循环 for(条件1:判断:变化)其实就是if嵌套 while do for循环简化版 可以用do while swith case ...
- ios之UITabelViewCell的自定义(xib实现)
通过继承UITableViewCell来自定义cell 1.创建一个空的项目.命名: 2.创建一个UITableViewController 并且同时创建xib: 3.设置AppDelegate.m中 ...
- CSS实现跳动的桃心
又来刷题--CSS动画实现跳动的桃心,从哪里跌倒就从哪里爬起来,哈哈哈~ 分析:首先,得画出一个桃心,然后再用动画效果让它跳起来(关于动画,实在是弱项啊~~~,得补补了). 第一步:画桃心,思路是一个 ...
- 删除mysql主从
在创建数据库主从配置后,若想删除数据库的主从服务可根据以下步骤来删除数据库主从 1.停止slave服务器的主从同步 为了防止主从数据不同步,需要先停止slave上的同步服务, STOP SLAVE ...
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 F题
The Heaviest Non-decreasing Subsequence Problem 解题心得 这个题就是一个简单的动态规划,非递减最长子序列的改版(加一个权重),只要把权重为5的改成5个权 ...