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

Problem Description
It is written in the Book of The Lady: After the Creation, the cruel god Moloch rebelled against the authority of Marduk the Creator.Moloch stole from Marduk the most powerful of all the artifacts of the gods, the Amulet of Yendor, and he hid it in the dark cavities of Gehennom, the Under World, where he now lurks, and bides his time.

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.

 
Input
Standard input will contain multiple test cases. The first line of the input is a single integer T (1 <= T <= 10) which is the number of test cases. T test cases follow, each preceded by a single blank line.

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.

 
Output
Results should be directed to standard output. Start each case with "Case #:" on a single line, where # is the case number starting from 1. Two consecutive cases should be separated by a single blank line. No blank line should be produced after the last test case.

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.

 
Sample Input
3
4 4 2 2
100 200
****
*@A*
*B<*
****
4 4 1 2
100 200
****
*@A*
*B<*
****
12 5 13 2
100 200
************
*B.........*
*.********.*
*@...A....<*
************
 
Sample Output
Case 1:
The best score is 200.
 
Case 2:
Impossible
 
 
Case 3:
The best score is 300.
 
Source
 

题意:

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的更多相关文章

  1. hdu 1044(bfs+状压)

    非常经典的一类题型 没有多个出口.这里题目没有说清楚 Collect More Jewels Time Limit: 2000/1000 MS (Java/Others)    Memory Limi ...

  2. hdu 1044(bfs+dfs+剪枝)

    Collect More Jewels Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  3. hdu 1044 BFS(压缩图)+DFS

    题意:              给你起点,终点,图上有墙有路还有宝物,问你在规定时间内能否能到终点,如果能问最多能捡到多少宝物. 思路:           看完这个题目果断 BFS+三维的mark ...

  4. HDU 1044 Collect More Jewels(BFS+DFS)

    Collect More Jewels Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  5. hdu 4531 bfs(略难)

    题目链接:点我 第一次不太清楚怎么判重,现在懂了,等下次再做 /* *HDU 4531 *BFS *注意判重 */ #include <stdio.h> #include <stri ...

  6. hdu.1044.Collect More Jewels(bfs + 状态压缩)

    Collect More Jewels Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  7. hdu 1044 Collect More Jewels(bfs+状态压缩)

    Collect More Jewels Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  8. HDU 1044

    http://acm.hdu.edu.cn/showproblem.php?pid=1044 代码题,没什么好说的,先预处理出两点间距离,然后dfs搜一下找最大值 #include <iostr ...

  9. HDU 2822 (BFS+优先队列)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2822 题目大意:X消耗0,.消耗1, 求起点到终点最短消耗 解题思路: 每层BFS的结点,优先级不同 ...

随机推荐

  1. node.js应用--转载

    最近,在向大学生们介绍 HTML5 的时候,我想要对他们进行问卷调查,并向他们显示实时更新的投票结果.鉴于此目的,我决定快速构建一个用于此目的的问卷调查应用程序.我想要一个简单的架构,不需要太多不同的 ...

  2. HDU 1007 Quoit Design(计算几何の最近点对)

    Problem Description Have you ever played quoit in a playground? Quoit is a game in which flat rings ...

  3. MySQL用户管理及权限管理

    MySQL 默认有个root用户,但是这个用户权限太大,一般只在管理数据库时候才用.如果在项目中要连接 MySQL 数据库,则建议新建一个权限较小的用户来连接. 在 MySQL 命令行模式下输入如下命 ...

  4. Centos7 下nginx nginx-1.13.4 安装

    环境:CentOS Linux release 7.3.1611 (Core)  Linux localhost.localdomain 3.10.0-514.26.2.el7.x86_64 #1 S ...

  5. 找bug——加分作业

    bug1:while循环中的*des++ =*src++; 不能这么写吧... bug2:maxSize没有定义 暂时看到这么多

  6. “今日校园” App 用户体验分析

    一.背景 为进一步提升信息化应用水平,更好的服务师生,南通大学智慧校园移动端APP“今日校园”定于11月5日正式上线运行.登陆APP可浏览学校新闻.校园生活.各部门微信公众号等内容,查看校内通知.校内 ...

  7. c#笔记整理 关于继承与多态等

    [ 塔 · 第 二 条 约 定 ] c#面向对象基础 整理private.protected.public.abstract等的异同 public 公有访问.不受任何限制. private 私有访问. ...

  8. object-oriented 第二次作业(2)

    面向对象程序设计自学计划 由于我的英文实在是很差,所以我就没有去考虑看英文的课程视频.网络上的课程有很多,什么学校的也有,一开始我不知道该如何开始选择课程.感觉每个都还可以.后来在群里的看到别人推荐的 ...

  9. Martin Fowler关于IOC和DI的文章(原版)

    Inversion of Control Containers and the Dependency Injection pattern In the Java community there's b ...

  10. Median of Two Sorted Arrays(hard)

    题目要求: 有两个排序的数组nums1和nums2分别为m和n大小. 找到两个排序数组的中位数.整体运行时间复杂度应为O(log(m + n)). 示例: 我的方法: 分别逐个读取两个数组的数,放到一 ...