非常经典的一类题型

没有多个出口。这里题目没有说清楚

Collect More Jewels

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

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
 
Recommend
JGShining   |   We have carefully selected several similar problems for you:  1195 1401 1067 1226 1104 
 
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <string>
#include <queue>
#include <stdlib.h>
using namespace std; struct node
{
int x,y,cnt;
}que[]; int n,m,t,tj;
int cost[];
int dis[][];
char g[][];
int sid,tid;
int mlink[][];
int qf,qd;
int up[]={,,-,};
int rl[]={,,,-};
int dp[][][]; void bfs(int sx,int sy)
{
int mark[][];
memset(mark,,sizeof(mark));
qf=qd=;
node finode;
mark[sx][sy]=;
finode.x=sx; finode.y=sy; finode.cnt=;
que[qf++]=finode;
while(qf>qd)
{
node cur=que[qd++];
for(int i=;i<;i++)
{
int tx,ty;
tx=cur.x+up[i];
ty=cur.y+rl[i];
if( (tx>=&&tx<n)&&(ty>=&&ty<m) && g[tx][ty]!='*'&& mark[tx][ty]==)
{
mark[tx][ty]=;
node nwnode;
nwnode.cnt=cur.cnt+;
nwnode.x=tx;nwnode.y=ty;
que[qf++]=nwnode;
if(mlink[tx][ty]!=-)
{
dis[ mlink[tx][ty] ][ mlink[sx][sy] ]=nwnode.cnt;
dis[ mlink[sx][sy] ][ mlink[tx][ty] ]=nwnode.cnt;
}
}
}
}
} int main()
{
int T;
int tt=;
scanf("%d",&T);
int flag=;
while(T--)
{
if(flag) printf("\n");
flag=;
scanf("%d%d%d%d",&m,&n,&t,&tj);
for(int i=;i<tj;i++)
scanf("%d",cost+i);
for(int i=;i<n;i++)
{
scanf("%s",g[i]);
}
memset(dis,-,sizeof(dis));
memset(mlink,-,sizeof(mlink));
int id=;
for(int i=;i<n;i++)
for(int j=;j<m;j++)
{
if(g[i][j]!='.'&&g[i][j]!='*')
{
if(g[i][j]=='@')
mlink[i][j]=;
else if( g[i][j]=='<')
{
id++;
mlink[i][j]=tj+;
}
else mlink[i][j]=g[i][j]-'A'+;
}
}
if(id>=)
{
for(int i=;i<;i++)
printf("%d\n",cost[i]); }
for(int i=;i<n;i++)
for(int j=;j<m;j++)
if(g[i][j]!='.'&&g[i][j]!='<'&&g[i][j]!='*')
{
bfs(i,j);
}
////////////
memset(dp,-,sizeof(dp));
dp[][][]=; for(int i=;i<=tj;i++)
{
for(int j=;j<=tj;j++)
{
for(int k=; k<(<<(tj+)) ;k++)
{
if(dp[i-][j][k]!=- && dp[i-][j][k] < t )
{
for(int p=;p<=tj;p++)
{
if( (k&(<<p)) == &&dis[j][p]!=-)
{
if(dp[i][p][(k|(<<p))]==-) dp[i][p][k|(<<p)] = dp[i-][j][k]+dis[j][p];
else dp[i][p][(k|(<<p))] = min(dp[i][p][(k|(<<p))],dp[i-][j][k]+dis[j][p]);
}
}
}
}
}
}
int ans=-;
for(int i=;i<=tj;i++)
for(int j=;j<=tj;j++)
for(int k=;k<(<<(tj+));k++)
if(dp[i][j][k]!=-&&dis[j][tj+]!=-)
if(dp[i][j][k]+dis[j][tj+]<=t)
{
int tmp=;
for(int p=;p<=tj;p++)
if( ((<<p)&k)!= )
tmp+=cost[p-];
ans=max(ans,tmp);
} printf("Case %d:\n",tt++);
if(ans==-) printf("Impossible\n");
else printf("The best score is %d.\n",ans);
}
return ;
}

hdu 1044(bfs+状压)的更多相关文章

  1. hdu 2209 bfs+状压

    http://acm.hdu.edu.cn/showproblem.php?pid=2209 不知为啥有种直觉.会出状压+搜索的题,刷几道先 简单的BFS.状压表示牌的状态, //#pragma co ...

  2. hdu 5025 bfs+状压

    http://acm.hdu.edu.cn/showproblem.php?pid=5025 N*N矩阵 M个钥匙 K起点,T终点,S点需多花费1点且只需要一次,1-9表示9把钥匙,只有当前有I号钥匙 ...

  3. hdu 1429 bfs+状压

    题意:这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方.刚开始 Ignatius被关在(sx,sy)的位置,离开地牢的门 ...

  4. HDU 4771 BFS + 状压

    Stealing Harry Potter's Precious Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 ...

  5. C - 小明系列故事――捉迷藏 HDU - 4528 bfs +状压 旅游-- 最短路+状压

    C - 小明系列故事――捉迷藏 HDU - 4528 这个题目看了一下题解,感觉没有很难,应该是可以自己敲出来的,感觉自己好蠢... 这个是一个bfs 用bfs就很好写了,首先可以预处理出大明和二明能 ...

  6. hdu 5094 Maze (BFS+状压)

    题意: n*m的迷宫.多多要从(1,1)到达(n,m).每移动一步消耗1秒.有P种钥匙. 有K个门或墙.给出K个信息:x1,y1,x2,y2,gi    含义是(x1,y1)与(x2,y2)之间有gi ...

  7. hdu 4771 Stealing Harry Potter's Precious (BFS+状压)

    题意: n*m的迷宫,有一些格能走("."),有一些格不能走("#").起始点为"@". 有K个物体.(K<=4),每个物体都是放在& ...

  8. 孤岛营救问题 (BFS+状压)

    https://loj.ac/problem/6121 BFS + 状压 写过就好想,注意细节debug #include <bits/stdc++.h> #define read rea ...

  9. HDU 5025:Saving Tang Monk(BFS + 状压)

    http://acm.hdu.edu.cn/showproblem.php?pid=5025 Saving Tang Monk Problem Description   <Journey to ...

随机推荐

  1. .NET设计模式(14):代理模式(Proxy Pattern)(转)

    摘要:在软件系统中,有些对象有时候由于跨越网络或者其他的障碍,而不能够或者不想直接访问另一个对象,如果直接访问会给系统带来不必要的复杂性,这时候可以在客户程序和目标对象之间增加一层中间层,让代理对象来 ...

  2. Unity3D研究院之LZMA压缩文件与解压文件

    原地址:http://www.xuanyusong.com/archives/3095 前两天有朋友告诉我Unity的Assetbundle是LZMA压缩的,刚好今天有时间那么就研究研究LZMA.它是 ...

  3. robotframework 测试工具添加PDF文件内容匹配插件

    robotframework  这个需要了解的请度娘.本文实现的是一个小功能.大体分为如下几个步骤 1)给定一个pdf文件. 2)读取pdf文件内容,并解析为文本内容. 3)通过给定的内容,比对pdf ...

  4. iOS第三方支付-银联支付

    #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> #import "UPPayPluginDeleg ...

  5. UITbaleView上按钮的单选

    设置Id属性,标记是哪个cell @property (nonatomic,assign)NSInteger Id; 设置一个普通状态和选中状态图片不同的按钮 _choose = [[UIButton ...

  6. Hbase Shell命令

    1 启动HBase shell 2 HBase shell 命令 3 我们将以“一个学生成绩表”的例子来详细介绍常用的 HBase 命令及其使用方法. 这里 grad 对于表来说是一个列,course ...

  7. TestDirector安装配置

    一.介绍 TestDirector是全球最大的软件测试工具提供商,公司生产企业级测试管理工具,也是业界第一个基于Web的测试管理系统,它可以在公司内部或外部进行全球范围内测试的管理.通过在一个整体的应 ...

  8. CentOS下如何查找大文件

    在Windows系统中,我们可以使用TreeSize工具查找一些大文件或文件夹,非常的方便高效,在Linux系统中,如何去搜索一些比较大的文件呢?下面我整理了一下在Linux系统中如何查找大文件或文件 ...

  9. 关于Struts2的Validator的配置找不到DTD

    看教材的时候写的DTD是 <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.3//EN&q ...

  10. ajax 一个 gbk 目标后内容乱码的解决方案

    ajax 一个 gbk 目标后,如果内容出现乱码,说明服务器在送出内容时没有指定 charset,ajax 对于没有指定 charset 的 response 默认以 utf-8 来处理,所有出现乱码 ...