Harry Potter has some precious. For example, his invisible robe, his wand and his owl. When Hogwarts school is in holiday, Harry Potter has to go back to uncle Vernon’s home. But he can’t bring his precious with him. As you know, uncle Vernon never allows such magic things in his house. So Harry has to deposit his precious in the Gringotts Wizarding Bank which is owned by some goblins. The bank can be considered as a N × M grid consisting of N × M rooms. Each room has a coordinate. The coordinates of the upper-left room is (1,1) , the down-right room is (N,M) and the room below the upper-left room is (2,1)….. A 3×4 bank grid is shown below:
 

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.
Input
  There are several test cases.
  In each test cases:
  The first line are two integers N and M, meaning that the bank is a N × M grid(0< N,M <= 100).
  Then a N×M matrix follows. Each element is a letter standing for a room. ‘#’ means a indestructible room, ‘.’ means a vulnerable room, and the only ‘@’ means the vulnerable room from which Dudely starts to move.
  The next line is an integer K ( 0 < K <= 4), indicating there are K Harry Potter’s precious in the bank.
  In next K lines, each line describes the position of a Harry Potter’s precious by two integers X and Y, meaning that there is a precious in room (X,Y).
  The input ends with N = 0 and M = 0
Output
  For each test case, print the minimum number of steps Dudely must take. If Dudely can’t get all Harry’s things, print -1.

大致题意:给定n*m的地图 , #为墙 @为起点 ,下面K个坐标,求遍历K个给定坐标,需要的最小步数。

思路:状压bfs

代码如下

#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
#define ll long long int
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};struct node
{int x,y,now,step;//now表示当前状态,step表示到达点(x,y)的状态为now时所需的最少步数
};int n,m;
int sx,sy;//起点坐标
int k;
int mp[110][110];
int vis[1<<4][110][110];
queue<node> que;
int bfs()
{while(!que.empty())que.pop();node p;p.x=sx;p.y=sy;p.now=mp[sx][sy];p.step=0;que.push(p);//将起点入队while(!que.empty()){node p=que.front();que.pop();if(p.now==(1<<k)-1)//如果走到当前位置的时候已经路过k个点,返回结果return p.step;for(int i=0;i<4;i++){node q=p;q.x=p.x+dx[i];q.y=p.y+dy[i];q.step=p.step+1;if(mp[q.x][q.y]==-1) //该点是障碍点continue;if(q.x<1||q.x>n||q.y<1||q.y>m)//超出边界continue;if(mp[q.x][q.y]>0&&(p.now&mp[q.x][q.y])==0)//该点是k个点之一且没走过q.now=p.now|mp[q.x][q.y];//标记一下if(vis[q.now][q.x][q.y]==0){vis[q.now][q.x][q.y]=1;que.push(q);} }}return -1;
}
int main()
{  while(cin>>n>>m){if(!(n+m))break;memset(vis,0,sizeof(vis));char ch;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){cin>>ch;if(ch=='@'){mp[i][j]=0;sx=i;sy=j;}if(ch=='#'){mp[i][j]=-1;}if(ch=='.'){mp[i][j]=0;}}cin>>k;for(int i=1;i<=k;i++){int x,y;cin>>x>>y;mp[x][y]=1<<(i-1);//用二进制来压缩状态}printf("%d\n",bfs());}return 0;
}

Stealing Harry Potter's Precious HDU - 4771 (状压+bfs)相关推荐

  1. Stealing Harry Potter‘s Precious HDU - 4771

    题意:给一个n*m的矩阵,小偷从@出发可以走".",墙是"#"不可走,之后又K个珠宝,并且给你这K个珠宝的坐标,问小偷最少要走多少步可以吧珠宝偷完,如果不能偷完 ...

  2. codevs 2594 解药还是毒药(状压+bfs)

    题目描述 Description Smart研制出对付各种症状的解药,可是他一个不小心,每种药都小小地配错了一点原料,所以这些药都有可能在治愈某些病症的同时又使人患上某些别的病症(你可能会问那-那是解 ...

  3. 【日常学习】【状压BFS】codevs2594 解药还是毒药题解

    题目描述 Description Smart研制出对付各种症状的解药,可是他一个不小心,每种药都小小地配错了一点原料,所以这些药都有可能在治愈某些病症的同时又使人患上某些别的病症(你可能会问那-那是解 ...

  4. hdu4771 Stealing Harry Potter's Precious (状压+bfs)

    Problem Description Harry Potter has some precious. For example, his invisible robe, his wand and hi ...

  5. hdu 1074 状压dp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 题意:有n个作业,对于每一个作业有一个deadline,有一个完成这作业所需要的时间.如果超过d ...

  6. hdu 4739 状压DP

    这里有状态压缩DP的好博文 题目:题目比较神,自己看题目吧 分析: 大概有两种思路: 1.dfs,判断正方形的话可以通过枚举对角线,大概每次减少4个三角形,加上一些小剪枝的话可以过. 2.状压DP,先 ...

  7. Travel(HDU 4284状压dp)

    题意:给n个城市m条路的网图,pp在城市1有一定的钱,想游览这n个城市(包括1),到达一个城市要一定的花费,可以在城市工作赚钱,但前提有工作证(得到有一定的花费),没工作证不能在该城市工作,但可以走, ...

  8. [HNOI2006]最短母串问题——AC自动机+状压+bfs环形处理

    Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. 32MB Input 第一行是一个正整数n(n< ...

  9. 小红的rpg游戏 (状压 bfs

    添加链接描述 因为怪物数量小于等于10 所以可以枚举每个怪物是否选择通过 使用状压枚举的方式从当前位开始bfs 选择dist最小的可能性 #include<bits/stdc++.h> u ...

  10. 【ICPC-212】hdu 4771 Stealing Harry Potter's Precious

    点击打开链接 题意:题目给定一个n*m的地图,地图有一个起点标记为'@',还有'#'表示不能够走的,'.'表示可以走.给定k个点,问从起点开始把这k个点走过去的最小步数. 思路:题目k的最大为4,那么 ...

最新文章

  1. Hadoop2.6.5集群搭建
  2. VS2005转换工作环境
  3. 关于Python编程的一些问答
  4. Eclipse文档注释快捷键以及自定义文档注释内容
  5. html quot代替src,html特效代码大全
  6. 【linux-command not find解决方法 】
  7. python自定义包的发布与安装
  8. gulp.js 4.0试用
  9. 修改对象的某个属性的值_如何理解Python中的面向对象编程?
  10. Linux中阶知识总结
  11. gz是什么意思饭圈_网上看不懂的字母缩写!知道Xs是什么意思吗?不是尺寸!...
  12. C编译器剖析_5.2.1 中间代码生成及优化_布尔表达式的翻译
  13. 2022年行研行业研究报告
  14. duxing201606很快乐
  15. 简述运用计算机思维解决问题的步骤,计算思维能力主要包括问题及问题求解过程的符号表示、逻辑思维与抽象思维、形式化证明、建立模型和模型计算、利用计算机技术等能力 答案:√...
  16. BZOJ2754: [SCOI2012]喵星球上的点名(AC自动机/后缀自动机)
  17. 事件抽取与事理图谱(二)
  18. 你所不知道的粘接强度检测知识大全详解
  19. 五笔加加导致程序调试退出崩溃
  20. Spring Cloud Zuul 那些你不知道的功能点

热门文章

  1. WPF Resource资源
  2. Html页面Js调用android本地相机和图片
  3. 什么是python语言的解释性?
  4. word背景图片设置a4纸大小教程
  5. Aspose.Words for .NET使用教程:如何使用脚注和尾注并设置每页行字数
  6. R语言(三) 你是我唯一的光 | 基于《白夜行》的文本可视化分析
  7. 【英语四六级-必背单词】高中英语单词 (G)-MP3试听与下载
  8. 谷歌邮箱无法登录问题
  9. 进阶级 - Git Hub 常用指南
  10. Hadoop1.0,2.0,3.0区别