HDU 1044 BFS
Collect More Jewels
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 7543 Accepted Submission(s): 1761
Your goddess The Lady seeks to possess the Amulet, and with it to gain deserved ascendance over the other gods.
You, a newly trained Rambler, have been heralded from birth as the instrument of The Lady. You are destined to recover the Amulet for your deity, or die in the attempt. Your hour of destiny has come. For the sake of us all: Go bravely with The Lady!
If you have ever played the computer game NETHACK, you must be familiar with the quotes above. If you have never heard of it, do not worry. You will learn it (and love it) soon.
In this problem, you, the adventurer, are in a dangerous dungeon. You are informed that the dungeon is going to collapse. You must find the exit stairs within given time. However, you do not want to leave the dungeon empty handed. There are lots of rare jewels in the dungeon. Try collecting some of them before you leave. Some of the jewels are cheaper and some are more expensive. So you will try your best to maximize your collection, more importantly, leave the dungeon in time.
The first line of each test case contains four integers W (1 <= W <= 50), H (1 <= H <= 50), L (1 <= L <= 1,000,000) and M (1 <= M <= 10). The dungeon is a rectangle area W block wide and H block high. L is the time limit, by which you need to reach the exit. You can move to one of the adjacent blocks up, down, left and right in each time unit, as long as the target block is inside the dungeon and is not a wall. Time starts at 1 when the game begins. M is the number of jewels in the dungeon. Jewels will be collected once the adventurer is in that block. This does not cost extra time.
The next line contains M integers,which are the values of the jewels.
The next H lines will contain W characters each. They represent the dungeon map in the following notation:
> [*] marks a wall, into which you can not move;
> [.] marks an empty space, into which you can move;
> [@] marks the initial position of the adventurer;
> [<] marks the exit stairs;
> [A] - [J] marks the jewels.
If the adventurer can make it to the exit stairs in the time limit, print the sentence "The best score is S.", where S is the maximum value of the jewels he can collect along the way; otherwise print the word "Impossible" on a single line.
题意:
n*m的迷宫,@是出发点,*是墙,.是路,<是出口,大写字母A~J表示该点有价值,问在t时间之内能否走出迷宫,若能走出求经过的最大价值。
输入T组数据
输入列m,行n,时间t,有价值的点的个数p
输入地图
代码:
//bfs,三维vis[i][j][k]标记数组,i,j表示点的位置,k表示到这个点时经过了多少有价值的点
//因为最多只有10个所以可以用二进制表示,价值只能取一次。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
char mp[][];
int T,n,m,t,p,val[],ans;
int dir[][]={,,-,,,,,-};
bool vis[][][<<],cost[][];
struct node{
int x,y,cnt,sum,sta;
node(){}
node(int a,int b,int c,int d,int e):x(a),y(b),cnt(c),sum(d),sta(e){}
}no1,no2;
void bfs(int px,int py){
memset(vis,,sizeof(vis));
memset(cost,,sizeof(cost));
no1=node(px,py,,,);
queue<node>q;
q.push(no1);
vis[px][py][]=;
while(!q.empty()){
no1=q.front();q.pop();
if(no1.cnt>t) continue;
if(mp[no1.x][no1.y]=='<'){
if(ans==-) ans=;
ans=max(ans,no1.sum);
}
for(int i=;i<;i++){
int x=no1.x+dir[i][],y=no1.y+dir[i][];
if(x<||x>=n||y<||y>=m) continue;
if(mp[x][y]=='*') continue;
if('A'<=mp[x][y]&&mp[x][y]<='J'){
if(no1.sta&(<<(mp[x][y]-'A'))){
if(vis[x][y][no1.sta]) continue;
vis[x][y][no1.sta]=;
no2=node(x,y,no1.cnt+,no1.sum,no1.sta);
q.push(no2);continue;
}
int tmp=no1.sta^(<<(mp[x][y]-'A'));
if(vis[x][y][tmp]) continue;
vis[x][y][tmp]=;
no2=node(x,y,no1.cnt+,no1.sum+val[mp[x][y]-'A'],tmp);
q.push(no2);
}
else{
if(vis[x][y][no1.sta]) continue;
vis[x][y][no1.sta]=;
no2=node(x,y,no1.cnt+,no1.sum,no1.sta);
q.push(no2);
}
}
}
}
int main()
{
scanf("%d",&T);
for(int cas=;cas<=T;cas++){
int px,py;
scanf("%d%d%d%d",&m,&n,&t,&p);
for(int i=;i<p;i++) scanf("%d",&val[i]);
for(int i=;i<n;i++){
scanf("%s",mp[i]);
for(int j=;j<m;j++)
if(mp[i][j]=='@') {px=i;py=j;}
}
ans=-;
bfs(px,py);
printf("Case %d:\n",cas);
if(ans==-) printf("Impossible\n");
else printf("The best score is %d.\n",ans);
if(cas!=T) printf("\n");
}
return ;
}
代码:
HDU 1044 BFS的更多相关文章
- hdu 1044(bfs+状压)
非常经典的一类题型 没有多个出口.这里题目没有说清楚 Collect More Jewels Time Limit: 2000/1000 MS (Java/Others) Memory Limi ...
- hdu 1044(bfs+dfs+剪枝)
Collect More Jewels Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- hdu 1044 BFS(压缩图)+DFS
题意: 给你起点,终点,图上有墙有路还有宝物,问你在规定时间内能否能到终点,如果能问最多能捡到多少宝物. 思路: 看完这个题目果断 BFS+三维的mark ...
- HDU 1044 Collect More Jewels(BFS+DFS)
Collect More Jewels Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- hdu 4531 bfs(略难)
题目链接:点我 第一次不太清楚怎么判重,现在懂了,等下次再做 /* *HDU 4531 *BFS *注意判重 */ #include <stdio.h> #include <stri ...
- hdu.1044.Collect More Jewels(bfs + 状态压缩)
Collect More Jewels Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- hdu 1044 Collect More Jewels(bfs+状态压缩)
Collect More Jewels Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- HDU 1044
http://acm.hdu.edu.cn/showproblem.php?pid=1044 代码题,没什么好说的,先预处理出两点间距离,然后dfs搜一下找最大值 #include <iostr ...
- HDU 2822 (BFS+优先队列)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2822 题目大意:X消耗0,.消耗1, 求起点到终点最短消耗 解题思路: 每层BFS的结点,优先级不同 ...
随机推荐
- Apache POI:Excel读写库
1)Apache POI 简介 Apache POI是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写 ...
- Caching Data in the Architecture (C#)
http://www.asp.net/web-forms/tutorials/data-access/caching-data/caching-data-in-the-architecture-cs ...
- SpringBoot在IntelliJ IDEA下for MAC 热加载
说在前面 热加载:文件内容变更服务器自动运行最新代码.实则在IDEA环境进行热部署后,下述过程一气呵成. 1代码变更,文件自动保存(IDEA自动保存代码,用户无需使用COMMAND+SAVE快捷键): ...
- 使用HTML5制作时钟
之前看到别人用HTML5制作时钟,自己也写了一个,这是很久以前写的了,没有注释,现在自己看都晕了(注释的重要性就体现在这边了),找时间加上注释,让自己和别人都比较好理解. <!DOCTYPE h ...
- $http.get(...).success is not a function 错误解决
$http.get(...).success is not a function 错误解决 1.6 新版本的AngularJs中用then和catch 代替了success和error,用PRomis ...
- java知乎爬虫
好久没写博客了,前阵子项目忙着上线,现在有点空闲,就把最近写的一个爬虫和大家分享下,统计结果放在了自己买的阿里云服务器上(点此查看效果),效果如下: 程序是在工作之余写的,用了java 的webmgi ...
- win10 死机
其实Win10系统还是不错的,如果你的电脑升级Win10后中招经常死机,可以用下面的方案来应对. 1.下载安装支持兼容Win10的软件版本,下载软件之前看一下兼容列表里是否有Win10系统.虽然Win ...
- tomcat端口号修改
修改Tomcat的端口号: 在默认情况下,tomcat的端口是8080,如果出现8080端口号冲突,用如下方法可以修改Tomcat的端口号: 首先: 在Tomcat的根(安装)目录下,有一个conf文 ...
- Java 二维数组
在 Java 中,二维数组与一维数组一样,但是不同于 C 中的二维数组: 1. 在 Java 中,二维数组可以看成是以数组为元素的数组,例如: int a[][] = {{1,2},{3,4,5,6 ...
- 利用JavaScriptSerializer类 进行Json对象的序列化和反序列化和过滤
项目下载:JavaScriptSerializer_对JSON对象序列化与反序列化及过滤器 利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化 1. 首 ...