逃离地牢

题目描述

小明明又被大威鱼抓住了,大威鱼把小明明关在地牢里,地牢由n * n 个房间组成,小明被困在地牢的最左上角的房间中,出口在最右下角,他想逃出这个诡异的地牢,但是他只能向下或者向右走。
小明每经过一个房间,都要受到一定的伤害(伤害都大于0),而且这个伤害可不是累加的哦,是累乘的,因此当他走出地牢的时候,他受到的伤害会非常大。但是小明有一个终极技能,能把受到的伤害X转变为金币,转化如下。
int val( type x )
{
  int ret = 0;
  while(x % 12 == 0) {
    x /= 12;
    ret++;
  }
  return ret;
}
请问小明最多能得到多少金币?

输入

输入包含多组测试用例,每组测试用例的第一行是一个整数n(n <= 50),接下来n行每行n个正整数 (<= 10 ^ 9) 表示每个房间对小名造成的伤害,当n 为 0 时输入结束。

输出

先输出Case,Case数从1开始,再输出小明获得的最大金币,具体输出形式见样例。

样例输入

3
12 1 24
6 3 4
4 4 16
0

样例输出

Case #1: 3

12 可以质因数分解为2 ^ 2 , 3所以就是找2和 3的数量最小值的最大,状态转移方程就是当前因子数= max(上一步,现在);


# include <iostream>
# include <cstdio>
# include <algorithm>
# include <cstring>

using namespace std;

const int maxn = 1e2 + 10;
int dp[maxn][maxn][2010];
int f[maxn][maxn][2];
int main(int argc, char *argv[])
{
    int n;
    int ca = 1;
    while(cin >> n, n)
    {


        int ans = 0;
        memset(f, false, sizeof(f));
        memset(dp,-1, sizeof(dp));
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= n; j++)
            {
                int x;
                cin >> x;
                int k1 = 0, k2 = 0;
                while(x % 2 == 0)
                {
                    x /= 2;
                    k1++;
                }
                while(x % 3 == 0)
                {
                    x /= 3;
                    k2++;
                }
                f[i][j][0] = k1;//2的个数
                f[i][j][1] = k2;//3的个数
            }



        for(int i = 0; i <= n; i++)
            for(int j = 0; j <= n; j++)
                dp[i][j][0] = 0;
        for(int i = 0; i <= n; i++)
        {
            for(int j = 0; j <= n; j++)
            {
                for(int p = f[i][j][0]; p <= 2000; p++)
                {
                    if(i == 0 || j == 0)
                    {
                        continue;
                    }
                    if(dp[i - 1][j][p - f[i][j][0]] != -1)//当前我这一步的2因子数是由上一步的2的因子数结合而来的,3的因子数也是
                    {
                        dp[i][j][p] = max(dp[i][j][p], dp[i - 1 ][j][p - f[i][j][0]] + f[i][j][1]);
                    }
                    if(dp[i][j - 1][p - f[i][j][0]] != -1)//当前我这一步的2因子数是由上一步的2的因子数结合而来的,3的因子数也是
                    {
                        dp[i][j][p] = max(dp[i][j][p], dp[i][j - 1][p - f[i][j][0]] + f[i][j][1]);
                    }
                }
            }
        }
       for(int i = 0; i <= 2000; i++)
           ans = max(min(dp[n][n][i],i / 2), ans);
        cout<<"Case #"<<ca++<<": "<<ans<<endl;

    }
    return 0;
}


 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity 是一款功能强大的游戏开发引擎,具有丰富的工具和资源,非常适合用于制作各种类型的游戏,包括地牢游戏。 制作地牢游戏需要完成以下几个主要步骤: 1. 地图生成:使用Unity的地形编辑器或自定义脚本生成地牢的地图布局。可以利用随机算法和规则,生成不同形状和难度的房间和通道。 2. 角色控制:创建一个角色控制器来实现玩家在地牢中的移动和交互。可以使用Unity的动画系统来实现角色的动作。 3. 怪物和陷阱:设计和实现各种怪物和陷阱,使游戏充满挑战性。可以使用Unity的粒子系统来制作特效和动态元素,增加游戏的可玩性和视觉效果。 4. 物品和道具:设计和放置各种道具和物品,如武器、药品、装备等,以增加游戏的深度和策略性。 5. 碰撞检测和交互:使用Unity的物理引擎检测碰撞,并实现角色与怪物、陷阱、物品之间的交互和触发事件。 6. UI设计和界面优化:创建和设计游戏的用户界面,包括主菜单、游戏设置、得分显示等,以提供良好的游戏体验。 7. 音效和音乐:选择合适的背景音乐和音效,使游戏更富有音乐感和氛围。 8. 测试和优化:在制作地牢游戏的过程中进行多次测试和优化,修复bug并提升游戏性能,以确保游戏的稳定和流畅运行。 以上是利用Unity制作地牢游戏的一般步骤和重点,当然在实际制作过程中还需要根据游戏的需求进行具体的调整和优化。通过充分发挥Unity的强大功能和灵活性,可以制作出具有丰富玩法、精美画面和流畅体验的地牢游戏作品。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值