【记忆化】【120819测试】【记忆化搜索专题】恶魔城(satanic.pas/c/cpp)

3: 恶魔城(Satanic Castle

(santanic.pas/cpp/c

问题描述:

上帝需要创造一位战士去消灭撒旦,这位战士必须要穿过恶魔城才能与撒旦决斗。恶魔城内有M条连接N个路口(从1到N编号)的街道,每一条街道都是单向的(也就是说你不能逆着该街道指定的方向走),并且在城内无论怎么走都不可能走回原来走过的地方。开始的时候,战士的生命力(HP)为INITHP、站在1号路口,而撒旦在第N号路口等待着他。每一条街道上都有许多魔鬼,但是也有一些街道已经被上帝派去的天使占领了。当战士经过连接i号向j号路口的街道时,如果占领该街道的是恶魔,那么他的HP先加倍然后减少L[i,j],我们记为A[i,j]=-L[i,j];如果占领该街道的是天使,那么他的HP就会先加倍然后增加L[i,j],我们记为A[i,j]=+L[i,j];如果该街道不存在,那么A[i,j]=0。如果某一时刻战士的HP<=0,那么他会死亡。因为这个战士将非常无敌,当他见到撒旦的时候只要还活着,就能一口气把撒旦消灭,所以上帝不希望让他的INITHP过高。

 

任务:

给定N,A[1..N,1..N],求最小的INITHP,使这个战士能够活着见到撒旦。

 

输入格式:

从文件SATANIC.DAT读入数据,文件第一行有一个正整数N(3 N 100),下面跟着的第i行第j个数为A[i,j](绝对值不超过10000的整数

 

输出格式:

输出所求最小的INITHP。

 

样例

SATANIC.DAT

SATANIC.OUT

4

0 -4 0 -10

0 0 +3 0

0 0 0 -10

0 0 0 0

 

4

 

 

这一题应该可以用宽搜做,但这是记忆化专题,就用记忆化吧,并且代码还短些

考试的时候没考虑到中间可能会有生命值不够的情况,就只得了60分

注意几点:①生命值最小为1

                  ②边界是到n这个点时返回1

     ③中间可能会出现f[i]<=0的情况,要更新成f[i]=1;

 

C++ Code

#include<cstdio>
#define MAXN 100+10
#define oo 999999999

int n,map[MAXN][MAXN];
int f[MAXN];

int hp(int x)
{
    if(x==n)return 1;
    if(f[x]!=oo)return f[x];
    for(int i=1;i<=n;i++)
    {
        if(map[x][i]!=0)
        {
            double a=(hp(i)-map[x][i])/2.0;
            int ans;
            if(a-int(a)>=1e-6) ans=(int)a+1;else ans=(int)a;
            f[x]<?=ans;
            if(f[x]<=0) f[x]=1;//中间可能出现生命值不够的情况,要更新成1
        }
    }
    return f[x];
}

int main()
{
    freopen("satanic.in","r",stdin);
    freopen("satanic.out","w",stdout);
    scanf("%d",&n);
    int i,j;
    for(i=1;i<=n;i++)f[i]=oo;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            scanf("%d",&map[i][j]);
    printf("%d",hp(1));
    return 0;
}

 

 

 

 

 

 

转载于:https://www.cnblogs.com/oijzh/archive/2012/08/21/2648581.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值