Collect More Jewels

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6148    Accepted Submission(s): 1386

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.
 
题意:@是起点,<是终点  .是路A到J是宝物每个宝物有不同的价值,要求你在t时间内走到出口,并带出最大价值的宝物
 
题解:结构体队列中jewel记录当前宝物是否遇见过,cost记录可获取宝物的价值,
 
#include<stdio.h>
#include<string.h>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<cstdio>
#include<string>
#include<math.h>
#include<algorithm>
#define LL long long
#define PI atan(1.0)*4
#define DD double
#define MAX 55
#define mod 10003
#define dian 1.000000011
#define INF 0x3f3f3f
using namespace std;
int head[MAX],ans;
int n,m,t,k;
char s[MAX][MAX];
int vis[MAX][MAX][1<<10];
int a[MAX];
struct node
{
int x,y,jewel,time,cost;
};
int Move[4][2]={1,0,-1,0,0,1,0,-1};
int judge(int a,int b)
{
if(a>=0&&a<n&&b>=0&&b<m&&s[a][b]!='*')
return 1;
return 0;
}
void bfs(int x1,int y1)
{
int i;
queue<node>q;
memset(vis,0,sizeof(vis));//刚开始忘记清空,一直错
while(!q.empty()) q.pop();
node beg,end;
beg.x=x1;
beg.y=y1;
beg.jewel=0;
beg.time=0;
beg.cost=0;
vis[beg.x][beg.y][beg.jewel]=1;
q.push(beg);
while(!q.empty())
{
beg=q.front();
q.pop();
if(s[beg.x][beg.y]=='<'&&beg.time<=t)
ans=max(ans,beg.cost);//找到最大的宝物价值
if(beg.time>t) continue;//超过时间
for(i=0;i<4;i++)
{
end.x=beg.x+Move[i][0];
end.y=beg.y+Move[i][1];
if(judge(end.x,end.y))
{
if(s[end.x][end.y]>='A'&&s[end.x][end.y]<='J')//找到宝物
{
end.jewel=beg.jewel;
end.time=beg.time+1;
int num=s[end.x][end.y]-'A';
if(end.jewel&(1<<num))//检查宝物是否已经拿走
end.cost=beg.cost;
else
{
end.cost=beg.cost+a[s[end.x][end.y]-'A'];
end.jewel=beg.jewel|(1<<num);
}
}
else//路
{
end.jewel=beg.jewel;
end.time=beg.time+1;
end.cost=beg.cost;
}
if(!vis[end.x][end.y][end.jewel])//标记当前位置
{
vis[end.x][end.y][end.jewel]=1;
q.push(end);
}
}
}
}
return ;
}
int main()
{
int l,op,x1,y1,i,j;
scanf("%d",&l);
op=1;
int ant=l;
while(l--)
{
scanf("%d%d%d%d",&m,&n,&t,&k);
memset(a,0,sizeof(a));
for(i=0;i<k;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++)
scanf("%s",s[i]);
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(s[i][j]=='@')
{
x1=i;y1=j;
}
}
}
ans=-1;
printf("Case %d:\n",op++);
bfs(x1,y1);
if(ans>0) printf("The best score is %d.\n",ans);
else printf("Impossible\n");
if(l)
printf("\n");
}
return 0;
}

  

hdu 1044 Collect More Jewels(bfs+状态压缩)的更多相关文章

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

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

  2. hdu 1044 Collect More Jewels

    题意: 一个n*m的迷宫,在t时刻后就会坍塌,问:在逃出来的前提下,能带出来多少价值的宝藏. 其中: ’*‘:代表墙壁: '.':代表道路: '@':代表起始位置: '<':代表出口: 'A'~ ...

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

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

  4. hdu 1885 Key Task(bfs+状态压缩)

    Problem Description The Czech Technical University years of its existence . Some of the university b ...

  5. HDU 3247 Resource Archiver (AC自己主动机 + BFS + 状态压缩DP)

    题目链接:Resource Archiver 解析:n个正常的串.m个病毒串,问包括全部正常串(可重叠)且不包括不论什么病毒串的字符串的最小长度为多少. AC自己主动机 + bfs + 状态压缩DP ...

  6. BFS+状态压缩 hdu-1885-Key Task

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1885 题目意思: 给一个矩阵,给一个起点多个终点,有些点有墙不能通过,有些点的位置有门,需要拿到相应 ...

  7. ACM/ICPC 之 BFS+状态压缩(POJ1324(ZOJ1361))

    求一条蛇到(1,1)的最短路长,题目不简单,状态较多,需要考虑状态压缩,ZOJ的数据似乎比POj弱一些 POJ1324(ZOJ1361)-Holedox Moving 题意:一条已知初始状态的蛇,求其 ...

  8. HDU1429+bfs+状态压缩

    bfs+状态压缩思路:用2进制表示每个钥匙是否已经被找到.. /* bfs+状态压缩 思路:用2进制表示每个钥匙是否已经被找到. */ #include<algorithm> #inclu ...

  9. poj 1753 Flip Game(bfs状态压缩 或 dfs枚举)

    Description Flip game squares. One side of each piece is white and the other one is black and each p ...

随机推荐

  1. XE4 IOS开发环境配置

    l 配置IOS的安装开发环境 使用RAD XE4开发IOS程序,一台MAC是必须的(也可以用虚拟机), MAC上需要安装Xcode, 独立版本的Commnand Line Tools 以及RAD的pa ...

  2. POJ 1458 最长公共子序列

    子序列就是子序列中的元素是母序列的子集,且子序列中元素的相对顺序和母序列相同. 题目要求便是寻找两个字符串的最长公共子序列. dp[i][j]表示字符串s1左i个字符和s2左j个字符的公共子序列的最大 ...

  3. 自己实现字符串操作函数strlen(),strcat(),strcpy(),strcmp()

    1.strlen()函数是求解字符串的有效长度的 1)非递归实现 size_t my_strlen(const char *str) { assert(str != NULL);  //断言,保证指针 ...

  4. BZOJ 2157 旅行

    裸链剖. 这大概是我第一份两百行左右的代码吧. 然而我把题看错了233333333调了将近两天. #include<iostream> #include<cstdio> #in ...

  5. HDU 5273 Dylans loves sequence (逆序对,暴力)

    题意: 给定一个序列,对于q个询问:(L,R)之间有几个逆序对?序列元素个数上限1000,q上限10万.仅1测试例子. 思路: [L,R]的逆序对数量可以这么算,假设L<=K<R,将区间拆 ...

  6. (转)Spark 算子系列文章

    http://lxw1234.com/archives/2015/07/363.htm Spark算子:RDD基本转换操作(1)–map.flagMap.distinct Spark算子:RDD创建操 ...

  7. 修改Chrome默认搜索引擎为Google.com

    在使用Chrome的时候,Google为增强本地化搜索,或将默认的Google搜索引擎转换为本地语言,如在中国会自动转到google.com.hk,日本会会自动转到google.co.jp,如果你是一 ...

  8. php 使用date()函数的报错

    错误提示: Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* ...

  9. 【基础数学】质数,约数,分解质因数,GCD,LCM

    1.质数: 质数(prime number)又称素数,有无限个.一个大于1的自然数,除了1和它本身外,不能整除以其他自然数(质数),换句话说就是该数除了1和它本身以外不再有其他的因数. 2.约数: 如 ...

  10. 【转】linux设备驱动程序中的阻塞机制

    原文网址:http://www.cnblogs.com/geneil/archive/2011/12/04/2275272.html 阻塞与非阻塞是设备访问的两种方式.在写阻塞与非阻塞的驱动程序时,经 ...