《啊哈算法》第三章--枚举 与 暴力

news2024/11/24 7:15:32

在这里插入图片描述

文章目录

  • 前言
  • 一、坑爹的奥数
  • 二、炸弹人
  • 三、火柴棍等式
  • 四、全排列
  • 总结


前言

前面我们学习了排序和栈 队列 链表,本节就学习暴力枚举的思想。


一、坑爹的奥数

在这里插入图片描述

在这里插入图片描述

题目1

□3 x 6528 = 3□ x 8256,在 □ 里填入相同数字使等式成立

代码如下

#include<iostream>
using namespace std;
int main()
{
	for(int i=1;i<=9;++i)
	{
		if((i*10+3)*6528 == (30+i)*8256)
			cout<<i<<endl;
	}
	return 0;
}

样例

输出:4

题目2

□□□ + □□□ = □□□

将数字1 ~ 9分别填入 □ 种,每个数字只能使用一次使等式成立

比如173 + 286 = 459 与 286 + 173 = 459 为一种可能
解题思路
因为有9个空格需要填充,所以可以暴力使用9个for循环,用 a[i] 表示第 i 个格子地数字,通过book数组标记数字1 ~ 9是否出现过

如果满足每个数字只出现一次,且满足等式,total++,注意最后输出total / 2

同时,为避免book[i]累加,每次开始前都要置零

代码如下

#include<iostream>
using namespace std;
int a[10], book[10];
int main()
{
    int i,total = 0; //可能的情况
    for(a[1] = 1; a[1] <= 9; ++a[1])
    for(a[2] = 1; a[2] <= 9; ++a[2])
    for(a[3] = 1; a[3] <= 9; ++a[3])
    for(a[4] = 1; a[4] <= 9; ++a[4])
    for(a[5] = 1; a[5] <= 9; ++a[5])
    for(a[6] = 1; a[6] <= 9; ++a[6])
    for(a[7] = 1; a[7] <= 9; ++a[7])
    for(a[8] = 1; a[8] <= 9; ++a[8])
    for(a[9] = 1; a[9] <= 9; ++a[9])//9个格子,9个for循环 
	{
        for(i = 1; i <= 9; ++i)
            book[i] = 0;//每次归零
        for(i = 1; i <= 9; ++i)
            book[a[i]] = 1; //标记是否出现
        int sum = 0;        //统计不同数字个数
        for(i = 1; i<= 9; ++i)
            sum += book[i]; //这里不是book[a[i]]
        if(sum == 9 && a[1]*100+a[2]*10+a[3] + a[4]*100
           +a[5]*10+a[6] == a[7]*100+a[8]*10+a[9]) 
		   {
           	 	total++;
            	cout<<a[1]<<a[2]<<a[3]<<"+"<<a[4]<<a[5]<<a[6]
                <<"="<<a[7]<<a[8]<<a[9]<<endl;
           }
    }
    cout<<total/2<<endl;
    return 0;
}

二、炸弹人

在这里插入图片描述

还记得小霸王游戏机上的“炸弹人”吗,用放置炸弹的方法来消灭敌人炸弹的爆炸方向沿上下左右四个方向
问在哪里放置炸弹可以消灭最多的敌人,已知两种墙,一种可以被炸掉
由于现在只有一枚炸弹,所以墙都用"#“表示(一枚炸弹可以炸掉这种墙,但也会被挡住)
敌人用"G"表示,空地用”."表示,只有空地才能放置炸弹

在这里插入图片描述

代码中的x, y表示第x行,第y列,且从第0行第0列开始计算

这里介绍一下走格子的表示方法:

向上 x–,向下 x++,向左 y–,向右 y++

代码如下

#include<iostream>
using namespace std;
int main()
{
	char a[20][21];//存放地图
	int n=0,m=0; 
	cin>>n>>m;
	int sum,i,j;
	int map=0,p=0,q=0;
	//读入n行字符
	for(int i=0;i<n;++i)
		cin>>a[i];
	//遍历地图
	for(i=0;i<n; ++i)
	{
		for(j=0;j<m; ++j)
		{
			//首先判断这个点是不是平地,是平地才可以放炸弹
			if(a[i][j]=='.')
			{
				sum=0;//sum用来计数,所以要反复初始化为0
				//将i,j分别放入到x与y当中以便于后续的向上下左右四个方向分别统计
				//可以消灭的敌人数
				
				//统计向上可以消灭的敌人数
				int x=i,y=j;
				while(a[x][y]!='#')//判断是不是墙,如果不是墙就继续 
				{
					if(a[x][y]=='G') sum++;//是敌人就计数 
					x--;//继续向上统计 
				}
				
				//统计向下可以消灭的敌人数
				x=i,y=j;
				while(a[x][y]!='#')
				{
					if(a[x][y]=='G') sum++;//是敌人就计数 
					x++;//继续向下统计 
				}
				
				//统计向左可以消灭的敌人数
				x=i,y=j;
				while(a[x][y]!='#')//判断是不是墙,如果不是墙就继续 
				{
					if(a[x][y]=='G') sum++;//是敌人就计数 
					y--;//继续向左统计 
				}
				
				//统计向右可以消灭的敌人数
				x=i,y=j;
				while(a[x][y]!='#')//判断是不是墙,如果不是墙就继续 
				{
					if(a[x][y]=='G') sum++;//是敌人就计数 
					y++;//继续向右统计 
				}
				
				if(sum>map)
				{
					map=sum;//保存最大值
					p=i;//保存坐标
					q=j;//保存坐标
				}
			}
		}
	}
	printf("将炸弹放在(%d, %d)处,最多可以消灭%d个敌人",p,q,map);
	return 0;
}
输入:
13 13
#############
#GG.GGG#GGG.#
###.#G#G#G#G#
#.......#..G#
#G#.###.#G#G#
#GG.GGG.#.GG#
#G#.#G#.#.###
##G...G.....#
#G#.#G###.#G#
#...G#GGG.GG#
#G#.#G#G#.#G#
#GG.GGG#G.GG#
#############

输出:将炸弹放在(9, 9)处,最多可以消灭8个敌人

思考时间

思考,如果将地图(6,11)的墙改为平地,小人默认站在(3,3)这个位置

在这里插入图片描述
炸弹放在(1, 11)处,最多可以消灭11个敌人,但小人根本走不到(1, 11)处

正确答案应该是放在(7, 11)处,可以消灭10个敌人,怎么解决这个问题呢?
我会在《啊哈算法》第四章的博客解决这个问题

三、火柴棍等式

小哼有 n(n <= 24) 根火柴棍,希望拼出形如 A + B = C 的等式,等式种的A,B,C均是用火柴棍拼出的整数(若该数非0,则最高位不为0),数字 1 ~ 9 的拼法如下图所示

要求:

1,+ 与 = 各自需要两根火柴

2,如果 A != B,则 A + B = C 与 B + A = C 视为不同等式(A,B,C 都大于 0)

3,所有火柴棍都要用上

#include<iostream>
using namespace std;
int fun(int x) //写个判断火柴数的函数
{
    int a[10] = {6,2,5,5,4,5,6,3,7,6}; //单个数字对应的火柴数
    int sum = 0; //火柴数
    while(x / 10 != 0) 
    {
        sum += a[x%10]; //敲重点
        x /= 10;
    }
    sum += a[x]; //此时x为个位数
    return sum;
}
int main()
{
    int n, c, all = 0;
    cin>>n; //总的火柴数
    for(int i=0;i<=1111; ++i)
        for(int j=0;j<=1111; ++j) 
        {
            c=i+j; //"="右边的数
            if(fun(i)+fun(j)+fun(c)==n-4) 
            {
                cout<<i<<"+"<<j<<"="<<c<<endl;
                all++;
            }
        }
    cout<<"可以拼出"<<all<<"种不同等式"<<endl;
    return 0;
}

四、全排列

DFS里面的经典问题,下一节详细讲解

也可以先看这个预习

AcWing算法学习—dfs


总结

终于完结了,下一节讲解搜素知识.

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PDF在线转PPT,不用下载软件网页在线即可转换!

PDF是我们经常在办公中使用的文件格式&#xff0c;它的兼容性和安全性使得它成为了传输文件的首选。而PPT则是我们常用的演示文稿格式&#xff0c;无论是在学校还是在公司&#xff0c;我们都需要制作演讲和汇报的PPT文件。由于这两种文件格式的重要性&#xff0c;我们经常需要进…

python的魔法函数

一、介绍 在Python中&#xff0c;魔法函数是以双下划线__开头和结尾的特殊函数。它们在类定义中用于实现特定的行为&#xff0c;例如运算符重载、属性访问、迭代等。 以下是一些常见的Python魔法函数&#xff1a; __init__: 这是一个特殊的构造函数&#xff0c;在创建类的实例…

JDBC中的Statement,PreparedStatement和CallableStatement

一旦获得连接&#xff0c;我们就可以与数据库进行交互。JDBC Statement、 CallableStatement 和 PreparedStatement 接口定义了方法和属性&#xff0c;这些方法和属性使您能够发送 SQL 命令并从数据库接收数据。 它们还定义了有助于弥合数据库中使用的 Java 和 SQL 数据类型之…

【阿Q送书第二期】《高并发架构实战:从需求分析到系统设计》

#挑战Open AI&#xff01;马斯克宣布成立xAI&#xff0c;你怎么看&#xff1f;# 文章目录 你想成为架构师嘛&#xff1f;架构经验高并发高并发架构实战特点值得推荐赠书规则 你想成为架构师嘛&#xff1f; 很多软件工程师的职业规划是成为架构师&#xff0c;但是要成为架构师很…

C语言-ubuntu下的命令

目录 linux命令 【1】打开关闭终端 【2】终端 【3】ls命令 【4】cd 切换路径 【5】新建 【6】删除 【7】复制 【8】移动 【9】常用快捷键 【10】vi编辑器 【11】简单编程步骤 任务&#xff1a; linux命令 【1】打开关闭终端 打开终端&#xff1a; 1. 直接点击 …

【1】Vite+Vue3 登录功能

一、介绍 在当今前端开发的领域里&#xff0c;快速、高效的项目构建工具以及使用最新技术栈是非常关键的。ViteVue3 组合为一体的项目实战示例专栏将带领你深入了解和掌握这一最新的前端开发工具和框架。 作为下一代前端构建工具&#xff0c;Vite 在开发中的启动速度和热重载…

sqlserver 获取根据特定符号分割字符串

CREATE function Get_StrArrayStrOfIndex (str varchar(1024), --要分割的字符串split varchar(10), --分隔符号index int --取第几个元素 ) returns varchar(1024) as begindeclare location intdeclare start intdeclare next intdeclare seed intset strltrim(rtrim(str))…

驾驶证——科目一笔记(三)

知识点1&#xff1a;红路灯 黄灯一直闪&#xff1a; 三个框的黄灯——信号暂时解除 一个框的黄灯——危险注意安全 知识点2&#xff1a;通行 看上半部分哪边有三角形 知识点2&#xff1a;禁停 知识点3&#xff1a;导向车道线 有齿可变&#xff0c;无齿导向&#xff08;按…

详解使用JAVA将Julian date(儒略日)日期转换为年月日

一、什么是Julian date 朱莉安日历和普通日历显示是不一样的我就举例演示一下 正常的日历显示 朱莉安的日历显示 174表示的是从2016年1月1日开始到今天已有174天了 普通日历是按月计数&#xff0c;朱莉安日历是按年计数 二、用java将julian日期转换为年月日 将2023199朱莉安…

微信小程序主体名称迁移流程

前言 因一些业务需求&#xff0c;需更换小程序主体名称 按理说&#xff0c;有两种方法&#xff0c; 第一种&#xff1a;重新注册小程序 第二种&#xff1a;在微信公众平台 → 设置 → 基本信息 → 主体信息 → 小程序迁移 第一种方法操作起来是很简单&#xff0c;但是呢&…

ubuntu 20.04 4090 显卡驱动安装 深度学习环境配置

1. 显卡驱动安装 准备工作&#xff1a; 换源安装输入法&#xff1a;重启的步骤先不管&#xff08;自选&#xff09;sudo apt update && sudo apt upgrade 禁用nouveau驱动&#xff08;这个驱动是ubuntu开源小组逆向破解NVIDIA的开源驱动&#xff0c;与英伟达的原有驱…

关于你欠缺的NoSQL中的redis和mongoDB

文章目录 前言一、在string list hash结构中&#xff0c;每个至少完成5个命令&#xff0c;包含插入 修改 删除 查询&#xff0c;list 和hash还需要增加遍历的操作命令1、STRING类型2、List类型数据的命令操作&#xff1a;3、举例说明list和hash的应用场景&#xff0c;每个至少一…

前端开发报表工具所必须的三大能力

摘要&#xff1a;本文由葡萄城技术团队于CSDN原创并首发。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 数据分析一直以来都是业务决策中非常重要的一环&#xff0c;在数字化时代尤其如此。然…

轻松实现文件夹批量重命名!教你如何使用顺序编号批量改名文件夹!

我们需要对大量文件夹进行重命名时&#xff0c;手动一个个改名无疑是一项耗时且繁琐的任务。不过&#xff0c;别担心&#xff01;我们将向您介绍一种简单而高效的方法来实现文件夹的批量重命名&#xff1a;使用顺序编号。无论是对照片文件夹、音乐文件夹、还是其他文件夹进行改…

cuda 安装教程(win10)

cuda&#xff1a;compute unitifed device architecture-统一计算设备架构。 NVIDIA cuDNN is a GPU-accelerated library of primitives for deep neural networks. 目录 cuda完整安装&#xff1a; 检查显卡安装版本 下载版本 cuda安装步骤 cudnn下载安装(需要登陆账号&…

(2023.07.05-2023.07.15)论文阅读简单记录和汇总

(2023.07.05-2023.07.15)论文阅读简单记录和汇总 2023/07/05&#xff1a;端午回家还没玩几天就被老板召唤回学校了&#xff0c;采购的事情真是太麻烦了&#xff0c;一堆的差错。昨天跟师弟把他的第一篇论文投出去了&#xff0c;祝好运&#xff01; 2023/07/10&#xff1a;可惜…

基于Java+SpringBoot+vue前后端分离社区团购系统设计实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

【Ceph的部署】

目录 一、基于 ceph-deploy 部署 Ceph 集群1、Ceph 生产环境推荐&#xff1a;2、Ceph 环境规划3、环境准备1、关闭 selinux 与防火墙2、根据规划设置主机名3、配置 hosts 解析4、安装常用软件和依赖包5、在 admin 管理节点配置 ssh 免密登录所有节点6、为每一个服务器配置时间同…

【129. 求根节点到叶节点数字之和

129. 求根节点到叶节点数字之和 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a; 原题链接&#xff1a; 129. 求根节点到叶节点数字之和 https://leetcode.cn/problems/sum-root-to-leaf-numbers/ 完成情况&#xff1a; 解题思路&#x…

vue2项目使用?.语法报错如何解决?(@babel/plugin-proposal-optional-chaining)

文章目录 一、问题原因二、下载并配置插件第一步第二步第三步 一、问题原因 因为有些浏览器版本不兼容?.语法&#xff0c;可以使用$$来代替&#xff08;如下图所示&#xff09;&#xff0c;但是为了团队协作避免麻烦使用?.带来的问题&#xff0c;可以使用这个(babel/plugin-p…