杀怪物(NHOI2011pj4)

news/2024/11/13 12:51:18/文章来源:https://www.cnblogs.com/czhzeta/p/18540487

题目

为了庆祝自己的生日,小张推出一款游戏。
游戏在一个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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/831964.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

今年测试这工资是认真的吗?

在如今的求职市场中,软件测试面试中的“八股文”几乎成为了一种必考内容。所谓“八股文”,指的是一系列标准化的技术面试题目,这些题目涵盖了测试理论、接口自动化测试、测试工具框架、性能测试、项目场景等多个方面...📝 博主首页 : 「码上生花」 ,同名公众号 :「伤心的…

开发人员,千万不要去碰那该死的业务参数,无论什么时候!

你好呀,我是歪歪。 前几天发了一个牢骚:本来只是单纯的吐槽一下,但是好多人对其中的细节比较感兴趣。 大家都是搞技术的嘛,对于“踩 BUG”这种喜闻乐见的事情,有兴趣是很正常的。 其实我这个 BUG,其实严格意义上不能叫做 BUG,因为和程序无关,甚至和技术的关系都不算大。…

java小课设:使用MySQL做一个聊天室

bro是个懒狗,耗时一个晚上,只写了一些基础功能,其他的可以根据需要自己添加实现思路:在MySQL数据库中设置一个message表,用来存储聊天信息,聊天界面输入的内容写入message表,用户程序每秒从MySQL中获取一次聊天记录,并加载进入自己的页面,实现聊天室。食用方法: Chat…

Quartz集群增强版_00.How to use?(如何使用)

Quartz集群增强版_00.How to use?(如何使用)转载请著名出处 https://www.cnblogs.com/funnyzpc/p/18540378开源地址 https://github.com/funnyzpc/quartz 表的基本结构 总的来说任务的配置及开发基本遵从上图的表的基本关系,除 app 以及 node 之外均需要手动手动配置,app…

开源三代示波器的高速波形刷新方案开源,支持VNC远程桌面,手机,Pad,电脑均可访问(2024-11-11)

说明: 1、本来这段时间是一年一度Hackaday硬件设计开源盛宴,但hackaday电子大赛在去年终结了。所以我开源个我的吧。 2、三代示波器的高速波形刷新方案,前两年就做好了,这两年忙H7-TOOL的更新比较多,三代示波器的更新就搁置了。但刷新方案是没问题的,开源分享给大家。 3、…

PSQL 环境安装配置

准备工作:安装包 plsqldev1400x64.msi 注册码 汉化包 chinese.exe 轻量级数据 instantclient_11_2 安装【PSQL】第一步大法操作! 默认的安装路径:C:\Program Files\PLSQL Developer 14安装【轻量级 instantclient_11_2】 复制或解压到 C:\Program Files\PLSQL Developer…

零声QT学习 一

int main(int argc, char *argv[]) {QApplication a(argc, argv);//QApplication a(argc, argv),针对QWidget应用程序,管理和设置Qt程序的运行//QGuiApplication a(argc, argv),针对非QWidget应用程序,如QQuick//QcoreApplication a(argc, argv),针对无界面的应用程序MainWindo…

【教程】第四章:任务与评论插件 —— 如虎添翼,顺利掌握

一起在 NocoBase 中创造精彩应用!这些教程将通过手把手的操作,帮助你全面掌握核心功能,激发灵感,打造并分享满足多样需求的应用。回顾上一节 小伙伴们还记得上一节的挑战任务吗?我们要为任务表配置 状态 和 附件 字段,并在任务列表里展示它们。别急,咱们先揭晓答案!状态…

wsl2踩坑日记(配置代理/zsh+p10k/Neovim)

1. proxy wsl --install Ubuntu-24.04 安装好 wsl 之后,测试了一下 v2rayN 的代理能不能正常使用(用 vultr 服务器搭建的校园网 ipv6 免流),发现可以 curl www.google.com,但是 sudo apt-get update 报错 Clearsigned file isnt valid, got NOSPLIT (does the network req…

基于MIMO系统的SDR-AltMin混合预编码算法matlab性能仿真

1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印): 仿真操作步骤可参考程序配套的操作视频。2.算法涉及理论知识概要基于MIMO(Multiple-Input Multiple-Output)系统的SDR-AltMin混合预编码算法是一种先进的无线通信技术,它结合了凸优化和交替最小化技术来…

前端技术对html中块级元素的学习

块级元素目录块级元素列表元素有序列表无序列表自定义列表 列表元素 有序列表 在 HTML 中, 标签用来表示有序列表。有序列表之间的内容有先后顺序之分,例如菜谱中的一系列步骤,这些步骤需要按顺序完成,这时就可以使用有序列表。 我们来看一个简单的实例: <!DOCTYPE ht…

IDEA-idea激活

通过百度网盘分享的文件:IDEA激活工具 链接:https://pan.baidu.com/s/18QIqrMVE4ScNhBjhwde_7Q 提取码:sky1二、重启电脑