首页 > 其他分享 >杀怪物(NHOI2011pj4)

杀怪物(NHOI2011pj4)

时间:2024-11-11 20:20:08浏览次数:3  
标签:体力 NHOI2011pj4 20 int #################### 怪物 操作

题目

为了庆祝自己的生日,小张推出一款游戏。
游戏在一个20*20的方格上进行,上面有一些怪物,用#表示,其他是空格,用 . 表示。怪物有两点体力。
体力为0时死亡。 你可以进行以下操作:

(1)使一个横行上的怪物体力减一
(2)使一个竖行上的怪物体力减一
对每个横行或竖行只能操作一次,限定n次,问最多能杀死多少个怪物。

样例:

10 
#################### 
#################### 
#################### 
#################### 
#################### 
#################### 
#################### 
#################### 
#################### 
#################### 
#################### 
#################### 
#################### 
#################### 
#################### 
#################### 
#################### 
#################### 
#################### 
####################

输出:

25

题解

在这个题目中,我们需要在一个 20×20 的方格内进行操作,方格中存在一些怪物(用 # 表示),这些怪物每个拥有 2 点体力。
我们可以通过执行操作来减少横行或竖行上怪物的体力,每行或每列的操作只能执行一次,并且有最多 ( n ) 次操作。
目标是计算在有限的操作次数内,最多能令多少个怪物的体力降至 0。

输入:第一行为一个整数 ( n ),表示可执行的操作次数。
随后是一个 20×20 的方格,以 # 和 . 表示怪物和空格。
输出:能击败的最大怪物数量。
程序结构
程序采用深度优先搜索(DFS)算法来探索不同的操作组合。
以下是程序的关键部分:

void dfs(int x,int y)
{
    if(y>=m)return;
    int t[25]={0},t1=0,t2=m-y;
    for(int i=1;i<=20;i++)
	{
		t[c[i]]++;
	}
    for(int i=20;i>0;i--)
    {
        if(t==0)break;
        if(t[i]<=t2)
		{
			t1+=t[i]*i;
			t2-=t[i];
		}
        else 
		{
			t1+=t2*i;
			t2=0;
		}
    }
    ans=max(ans,t1);
    for(int i=x;i<=20;i++)
    {
        for(int j=1;j<=20;++j)
		{
			if(a[i][j])
			{
				c[j]++;
			}
		}
        dfs(i+1,y+1);
        for(int j=1;j<=20;++j)
		{
			if(a[i][j])
			{
				c[j]--; 
			}
		}
    }
    return;
}

变量和数组定义:

n: 可操作的次数。
a[25][25]: 用于存储方格內怪物的体力,# 初始化为 2,. 初始化为 0。
c[25]: 计数器数组,用于记录每一列的怪物数量。

函数 dfs(int x, int y) 负责探索所有可能的操作组合。

在每次递归中,首先检查是否已进行 ( n ) 次操作。

记录当前的怪物数量,并尝试进行横行或竖行的操作,递归调用 dfs 函数。

最大怪物数量的计算:

每次操作后,通过 max 函数更新可击败的怪物最大数量。
ans: 存储能击败的最大怪物数量。

#include <iostream>
#include <queue>
using namespace std;
struct node
{
    int x;
    int y;
};
queue<node> q;
int n,m,sum;
char map[105][105];
int vist[105][105];
char buff[10005];
void acc(node no,int ox,int oy)
{
    if(oy>=1&&ox>=1&&ox<=n&&oy<=m)
    {
        if(map[ox][oy]=='#'){
            if(vist[ox][oy]==0){
                vist[ox][oy]=no.x*m+no.y;
            }
            else if(vist[ox][oy]==no.x*m+no.y);
            else{
                sum++;
                vist[ox][oy]=no.x*m+no.y;
            }
        }
        else{
            if( vist[ox][oy]==0){
                vist[ox][oy]=1;
                node newNode={ox,oy};
                q.push(newNode);
            }
        }
 
    }
     
}
void bfs(node no)
{
    q.push(no);
    while (!q.empty()) {
        node ncur=q.front();
        q.pop();
        int ox,oy;
        ox=ncur.x;
        oy= ncur.y-1;
         acc(no,ox,oy);
        ox=ncur.x;
        oy=ncur.y+1;
        acc(no,ox,oy);
        ox=ncur.x-1;
        oy=ncur.y;
        acc(no,ox,oy);
        ox=ncur.x+1;
        oy=ncur.y;
        acc(no,ox,oy);
    }
}
int main(){
    cin>>n>>m;
    for (int i=1;i<=n;i++){
        cin>>buff;
        for (int j=0;j<m;j++)
            map[i][j+1]=buff[j];
    }
    node n11={1,1};
    vist[1][1]=1;
    bfs(n11);
    node nmn={n,m};
    vist[n][m]=1;
    bfs(nmn);
    cout<<sum;
    return 0;
}

标签:体力,NHOI2011pj4,20,int,####################,怪物,操作
From: https://www.cnblogs.com/czhzeta/p/18540487

相关文章

  • 【SSL 1823】消灭怪物(非传统BFS)
    题目大意小b现在玩一个极其无聊的游戏,它控制角色从基地出发,一路狂奔夺走了对方的水晶,可是正准备回城时,发现地图上已经生成了n个怪。现在假设地图是二维平面,所有的怪和角色都认为是在这个二维平面的点上。请你帮小b计算一下,从现在角色的位置开始,至少要消灭几个怪才能回到基地(坐......
  • 《怪物猎人:崛起》libcmn.dll丢失问题的深入修复指南
    《怪物猎人:崛起》是一款非常受欢迎的动作角色扮演游戏,但在运行时可能会遇到“libcmn.dll丢失”的错误。这个问题通常是由于缺少必要的文件或系统配置不正确导致的。以下是一个深入的修复指南,帮助你解决这个问题。重新安装游戏步骤:1.卸载游戏:•打开Steam,右键点击《怪物猎人:......
  • 了解如何在 <lines (Modulojs) 中创建 API 支持的 Zelda BOTW 怪物画廊 Web 组件
    模数教程回来了!大家好!暑假结束后,我带着modulo教程回来了。我正在制作更多教程-请继续关注。也就是说,如果您对我的下一个主题有任何特别的想法,请务必在评论中告诉我!我的上一篇教程是关于api驱动的pokémondanceparty组件的超级快速且有趣的“仅html,无js”教程,不到30......
  • 《怪物猎人物语:复刻版》游戏启动时闪退弹窗“找不到vcomp100.dll”该怎么办?怪物猎人物
    当启动《怪物猎人物语:复刻版》时,游戏闪退并弹窗显示“找不到vcomp100.dll”,这可让人着急。或许需要对系统进行修复、更新相关程序,或者重新获取该文件。您遇到过这种情况吗?知道该如何应对吗?本篇将为大家带来《怪物猎人物语:复刻版》游戏启动时闪退弹窗“找不到vcomp100.dll”该怎......
  • 怪物猎人
    学会用【替换】的思维方式去看待问题,也就是先假设所有的攻击都造成x伤害,再逐次将攻击的伤害由x替换成y当然你猜的结论也是对的输出用“endl"奇慢,本机感觉跑了20s才跑完,换成"\n"就几乎秒出结果了点击查看代码#include<bits/stdc++.h>usingnamespacestd;intmain(){ i......
  • 《怪物猎人世界》游戏修改器:风灵月影六十七项功能全攻略
    《怪物猎人世界》(MonsterHunter:World)的风灵月影修改器,是一种专门为这款游戏设计的辅助工具,用于在游戏中提供多种自定义选项,以增强游戏体验或降低游戏难度。这类修改器通常由第三方开发者制作,并非官方发布,因此使用时需要注意可能带来的风险。《怪物猎人世界》六十七项风灵......
  • Unity 麦扣 x 勇士传说 全解析 之 怪物基类(2)(附各模块知识的链接,零基础也包学会的牢弟)(
    1.怪物的动画逻辑一览2.怪物的受伤死亡逻辑一览usingSystem.Collections;usingSystem.Collections.Generic;usingSystem.Xml;usingUnityEngine;publicclassMonster:MonoBehaviour{[Header("速度")]publicfloatnormalSpeed;publicfloatchas......
  • 0244-RLTK-增加地图怪物
    环境Time2022-12-01WSL-Ubuntu22.04RLTK0.8.7前言说明参考:https://bfnightly.bracketproductions.com/rustbook目标基于前一节的内容,在每个房间的中间放置怪物。comp.rsuserltk::{console,field_of_view,Point,RGB};usespecs::prelude::*;usespecs_derive:......
  • Unity 麦扣 x 勇士传说 全解析 之 怪物基类与野猪(附各模块知识的链接,零基础也包学会的
    通过一阵子的学习,我是这么认为的,因为该教程是难度两星的教程 ,也就是适合学了一阵子基础组件以后的学习者(什么都不会的学习者要是学这套课程会困难重重,如果你什么都不会那么需要学习一星教程)所以该课程没有那么多manger,代码也不那么面向对象,但是从怪物类之后就开始有相关的内......
  • Monsters Pack 04(游戏卡通可爱怪兽怪物战士模型)
    以下模型有3种进化形态:捕手战士鱼卫战士骑士战士小鬼战士猴东战士无鼻战士坑娃战士刺头战士树斯特战士楔形战士这些模型是为您的主要角色设计的敌人。进化的每个阶段都会使他变得更加强大,因此您可以用它来增强对手的实力,并作为敌人的boss。它适用于不同类型的游戏......