HDU 3442 Three Kingdoms(状态压缩 + BFS )
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3442
题目大意:三国时期,刘备逃亡。给定一个最大为50*50的地图,刘备在地图中只能往4个方向走。
地图中,A代表瞭望塔,攻击范围是2,攻击伤害是1;
B 代表堡垒,攻击范围是3,攻击伤害是2;
C 代表火焰,对于走在该位置上的单位造成3点伤害;
D 代表弓箭手,攻击范围是2,攻击伤害是4;
E 代表士兵,攻击范围是1,攻击伤害是5;
$ 代表刘备;
! 代表目的地;
# 代表障碍物
. 代表地板
刘备不能穿过A,B,D,E。但是可以走上C和地板。 有3条重要规则:
1.刘备不能被相同的东西伤害2次,比如之前被瞭望塔伤害过,之后再走近瞭望塔的攻击范围时不受伤害。
2.当刘备到达目的地,首先要计算他受到的伤害,然后结束游戏。
3.不需要计算刘备在开始位置受到的伤害。
判断刘备是否可以消耗最少HP,到达目的地,求出最少消耗。
令dp[i][j][s]表示刘备在(i,j)的位置时,受伤害的状态为s时,HP的最小花费。则答案为终点位置,所有受伤状态里边HP的最小花费。
接下来BFS
代码如下:
# include<cstdio>
# include<cstring>
# include<queue>
# include<cmath>
using namespace std;
const int MAX = ;
char map[MAX][MAX];
int damage[MAX][MAX]; //地图上的每一个位置刘备受到的伤害,如果为-1,表示刘备不能进入该位置
int dp[MAX][MAX][<<];
int dx[] = {,,,-};
int dy[] = {,,-,};
struct node{
int x,y,hp;
}st,u,v; int n, m, sx, sy, ex, ey;
queue<node >q;
bool judge(int x,int y){
if(x>= && x<n &&y>= && y<m && damage[x][y] != )
return true;
return false;
}
void init(){ //将原地图转化成刘备受伤害的地图
int i,j,x,y,bx,by;
memset(damage,,sizeof(damage));
for(i=; i<n; i++){
for(j=; j<m; j++){
if(map[i][j] == '#')
damage[i][j] = -; //不可以踏入 else if(map[i][j] == '$')
sx = i, sy = j; else if(map[i][j] == '!')
ex = i, ey = j; else if(map[i][j] == 'A'){
damage[i][j] = -;
for(x=-; x<; x++){
for(y=-; y<; y++){
if(abs(x) + abs(y) >) continue;
bx = i+x;
by = j+y;
if(judge(bx,by))
damage[bx][by] |= ;
}
}
}
else if(map[i][j]=='B'){
damage[i][j] = -;
for(x=-; x<; x++){
for(y=-; y<; y++){
if(abs(x) + abs(y) > ) continue;
bx = i+x;
by = j+y;
if(judge(bx,by))
damage[bx][by] |= <<;
}
}
}
else if(map[i][j] == 'C')
damage[i][j] |= <<; else if(map[i][j] == 'D'){
damage[i][j] = -;
for(x=-; x<; x++){
for(y=-; y<; y++){
if(abs(x) + abs(y) >) continue;
bx = i+x;
by = j+y;
if(judge(bx,by))
damage[bx][by] |= <<;
}
}
}
else if(map[i][j] == 'E'){
damage[i][j] = -;
for(x=-; x<; x++){
for(y=-; y<; y++){
if(abs(x) + abs(y) >) continue;
bx = i+x;
by = j+y;
if(judge(bx,by))
damage[bx][by] |= <<;
}
}
} }
}
}
int main(){
int T,cas;
int i,j;
scanf("%d",&T);
for(cas=; cas<=T; cas++)
{
scanf("%d%d",&n,&m);
for(i=; i<n; i++)
scanf("%s", map[i]);
init();
st.x = sx;
st.y = sy;
st.hp = ;
memset(dp, -, sizeof(dp));
dp[st.x][st.y][] = ;
//以上为初始化
q.push(st);
int a, b, c;
//BFS
while(!q.empty()){
u = q.front();
q.pop();
for(i=; i<; i++){
b = dp[u.x][u.y][u.hp];
v.x = u.x + dx[i];
v.y = u.y + dy[i];
if(v.x>=n || v.x< || v.y>=m || v.y< ) continue; //不在地图上
if(damage[v.x][v.y] == -) continue; //不能踏入 for(j=; j<; j++){
a = damage[v.x][v.y] & (<<j); //此位置是否有给单位的伤害
c = u.hp & (<<j); //刘备是否已经受过了该单位的伤害
if(a!= && c==)
b += j+; //刘备受到伤害,伤害值为j+1
}
v.hp = u.hp | damage[v.x][v.y]; //经过该点受到的总伤害
if(dp[v.x][v.y][v.hp] == - || dp[v.x][v.y][v.hp] > b){
dp[v.x][v.y][v.hp] = b;
q.push(v);
}
} }
int ans = -;
for(i=; i< (<<); i++){
if(dp[ex][ey][i] != - && (dp[ex][ey][i]<ans || ans==-))
ans = dp[ex][ey][i];
}
printf("Case %d: %d\n",cas,ans);
}
return ;
}
HDU 3442 Three Kingdoms(状态压缩 + BFS )的更多相关文章
- hdu 3681 Prison Break(状态压缩+bfs)
Problem Description Rompire . Now it’s time to escape, but Micheal# needs an optimal plan and he con ...
- HDU 4634 Swipe Bo 状态压缩+BFS最短路
将起始点.终点和钥匙统一编号,预处理: 1.起始点到所有钥匙+终点的最短路 2.所有钥匙之间两两的最短路 3.所有钥匙到终点的最短路 将起始点和所有钥匙四方向出发设为起点BFS一遍,求出它到任意点任意 ...
- 胜利大逃亡(续)(状态压缩bfs)
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- hdu 4352 数位dp + 状态压缩
XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 5025 Saving Tang Monk 【状态压缩BFS】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=5025 Saving Tang Monk Time Limit: 2000/1000 MS (Java/O ...
- 【HDU - 1429】胜利大逃亡(续) (高级搜索)【状态压缩+BFS】
Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)…… 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方.刚开 ...
- 「hdu 4845 」拯救大兵瑞恩 [CTSC 1999](状态压缩bfs & 分层图思想)
首先关于分层图思想详见2004的这个论文 https://wenku.baidu.com/view/dc57f205cc175527072208ad.html 这道题可以用状态压缩,我们对于每一把钥匙 ...
- [HDU 4336] Card Collector (状态压缩概率dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4336 题目大意:有n种卡片,需要吃零食收集,打开零食,出现第i种卡片的概率是p[i],也有可能不出现卡 ...
- HDU 4511 (AC自动机+状态压缩DP)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4511 题目大意:从1走到N,中间可以选择性经过某些点,比如1->N,或1->2-> ...
- hdu 2825(ac自动机+状态压缩dp)
题意:容易理解... 分析:在做这道题之前我做了hdu 4057,都是同一种类型的题,因为题中给的模式串的个数最多只能为10个,所以我们就很容易想到用状态压缩来做,但是开始的时候我的代码超时了dp时我 ...
随机推荐
- 人工神经网络(Artificial Neural Networks)
人工神经网络的产生一定程度上受生物学的启发,因为生物的学习系统是由相互连接的神经元相互连接的神经元组成的复杂网络.而人工神经网络跟这个差不多,它是一系列简单的单元相互密集连接而成的.其中每个单元有一定 ...
- 配置 Web Deploy 的步骤 -摘自网络
今天的文章里,我会介绍Microsoft Web Deploy—一个采用全面的发布和部署机制的免费服务器技术.Web Deploy不仅仅让你发布文件—还可以部署数据库结构/数据,运行变更的数据库脚本, ...
- POJ 3295 Tautology (构造题)
字母:K, A, N, C, E 表示逻辑运算 字母:p, q, r, s, t 表示逻辑变量 0 或 1 给一个字符串代表逻辑表达式,如果是永真式输出tautology 否则输出not 枚举每个逻辑 ...
- vbs脚本发送邮件
NameSpace = "http://schemas.microsoft.com/cdo/configuration/"Set Email = CreateObject(&quo ...
- ios 添加到cell 上的button点击无效!扩大button的点击区域(黑魔法)
一般情况下点击效果都是正常的!要不然你对它做了什么?一般细心的小伙伴都没有遇到这种情况,但是呢! 当然我是二班的!在这里我主要讲两个问题,解决问题和普及魔法. 一.普及问题(button在cell上点 ...
- 中文乱码 jsp正常后台接收异常
关于中文乱码:1,解决GET方式中的中文编码问题. 在Jsp中如果用中文方式传递编码,一定要保证传递过去的是U8:情况一:在便签中<s:action > 可以使用<s:param&g ...
- Atom实例
示例[编辑] 一个Atom文档: <?xml version="1.0" encoding="utf-8"?> <feed xmlns=&qu ...
- Java凝视Override、Deprecated、SuppressWarnings具体解释
一.什么是凝视 说起凝视,得先提一提什么是元数据(metadata).所谓元数据就是数据的数据.也就是说,元数据是描写叙述数据的.就象数据表中的字段一样,每一个字段描写叙述了这个字段下的数据的 ...
- SEAndroid安全机制对Binder IPC的保护分析
在SEAndroid安全机制中,除了文件和属性,还有Binder IPC须要保护.Binder IPC是Android系统的灵魂,使用得相当广泛又频繁.比如,应用程序都是Binder IPC请求訪问系 ...
- Offer是否具有法律效力?
版权声明:原创作品,同意转载,转载时请务必以超链接形式标明文章原始出版.作者信息和本声明.否则将追究法律责任.本文地址: http://blog.csdn.net/jobchanceleo/archi ...