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

news2024/11/19 2:39:21

 从无到有学算法(看漫画学算法)

  (๑•̀ㅂ•́)و✧ 爱要坦荡荡 - 萧潇 - 单曲 - 网易云音乐

 

 一,坑爹的奥数

枚举算法又叫穷举算法,非常的暴力,它的基本思想是“有序地去尝试每一种可能” 

题目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是否出现过

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

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

#include<iostream>
using namespace std;
int a[10], book[10];
int main()
{
    int i, ans = 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]) {
            ans++;
            cout<<a[1]<<a[2]<<a[3]<<"+"<<a[4]<<a[5]<<a[6]
                <<"="<<a[7]<<a[8]<<a[9]<<endl;
           }
    }
    cout<<ans / 2<<endl;
    return 0;
}
......(一共336行,所以是168种搭配)
738+216=954
739+125=864
745+218=963
745+236=981
746+235=981
748+215=963
752+184=936
754+182=936
762+183=945
763+182=945
782+154=936
782+163=945
783+162=945
784+152=936
168

 二,炸弹人

 还记得小霸王游戏机上的“炸弹人”吗,用放置炸弹的方法来消灭敌人

炸弹的爆炸方向沿上下左右四个方向

问在哪里放置炸弹可以消灭最多的敌人,已知两种墙,一种可以被炸掉

由于现在只有一枚炸弹,所以都用"#"表示(一枚炸弹可以炸掉这种墙,但也会被挡住)

敌人用"G"表示,空地用"."表示,只有空地才能放置炸弹

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

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

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

统计每一个空地放置炸弹,可以消灭的总人数(上下左右四个方向敌人个数的和)

#include<iostream>
#include<cstdio> //printf()
using namespace std;
int main()
{
    char a[20][20];
    int m, n;
    cin>>m>>n; //m行,n列
    for(int i = 0; i < m; ++i)
        cin>>a[i]; //输入m行字符串
    int sum, i, j; //每个点消灭敌人个数
    int ans = 0, maxi = 0, maxj = 0;
    //两个for枚举地图中每个点
    for(i = 0; i < m; ++i)
        for(j = 0; j < n; ++j) {
            if(a[i][j] == '.') {//是空地
                sum = 0; //消灭敌人个数
                //向上
                int x = i, y = j;
                while(a[x][y] != '#') {//不是墙
                    if(a[x][y] == 'G') //遇到敌人
                        sum++; //消灭
                    x--; //x--要和if并列
                }
                //向下
                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 > ans) { //这个if要放在空地的if里
                ans = sum; //保留最大值
                maxi = i;
                maxj = j;
            }
            }
        }
    printf("将炸弹放在(%d, %d)处,最多可以消灭%d个敌人",
               maxi, maxj, ans);
    //i, j要声明在遍历之前,否则输出0,0
    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)处

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#
#############
将炸弹放在(1, 11)处,最多可以消灭11个敌人

正确答案应该是放在(7, 11)处,可以消灭10个敌人,怎么解决这个问题呢?

我会在《啊哈算法》第四章的博客解决这个问题

三,火柴棍等式(NOIP2008提高组)

 

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

要求:

1,+ 与 = 共需要4根火柴棍

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

3,所有火柴棍都要用上

注意:

代码第18,19行,为什么遍历到1111呢,因为 n <= 24,除掉 = 和 + 那4跟,还剩20跟

0 ~ 9 中数字 1 需要的火柴棍最少,只需要2根,而20根火柴棍最多组成10个1,所以A,B,C任何一个数都不超过1111

#include<iostream>
using namespace std;
int num(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(num(i) + num(j) + num(c) == n - 4) {
                cout<<i<<"+"<<j<<"="<<c<<endl;
                all++;
            }
        }
    cout<<"可以拼出"<<all<<"种不同等式"<<endl;
    return 0;
}
18
0+4=4
0+11=11
1+10=11
2+2=4
2+7=9
4+0=4
7+2=9
10+1=11
11+0=11
可以拼出9种不同等式

四,数的全排列

这一小节只是为了下一章搜索(dfs等)的引入

123的全排列是123,132,213,231,312,321

1234的全排列是....

123的全排列可以用三重for循环嵌套

1234可以用四重for.....

但如果求123456789的全排列呢,,,

那如果输入n求1 ~ n的全排列呢?比如输入13,求12345678910111213的全排列....

欲知后事如何,且听下回分解(本来打算用随机数做下,感觉半小时写不出来就算了)

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

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

相关文章

【JavaEE】网络初识之网络通信基础

✨哈喽&#xff0c;进来的小伙伴们&#xff0c;你们好耶&#xff01;✨ &#x1f6f0;️&#x1f6f0;️系列专栏:【JavaEE】 ✈️✈️本篇内容:网络初识之网络通信基础。 &#x1f680;&#x1f680;代码存放仓库gitee&#xff1a;JavaEE初阶代码存放&#xff01; ⛵⛵作者简介…

Uniswap v3 详解(二):创建交易对/提供流动性

前文已经说过 Uniswap v3 的代码架构。一般来说&#xff0c;用户的操作都是从 uniswap-v3-periphery 中的合约开始。 创建交易对 创建交易对的调用流程如下&#xff1a; 用户首先调用 NonfungiblePositionManager 合约的 createAndInitializePoolIfNecessary 方法创建交易对&…

【软件测试】软件测试分类

1. 按照测试对象划分 界面测试 界面测试&#xff08;简称UI测试)&#xff0c;测试用户界面的功能模块的布局是否合理、整体风格是否一致、各个控件的放置位置是 否符合客户使用习惯&#xff0c;此外还要测试界面操作便捷性、导航简单易懂性&#xff0c;页面元素的可用性&…

U3751频谱分析仪

18320918653 U3751 频谱分析仪爱德万U3751特点&#xff1a; 频率范围&#xff1a;9kHz&#xff5e;8GHz 大输入电平&#xff1a;30dBm RBW&#xff1a;300Hz&#xff5e;3MHz 体积小&#xff0c;重量轻(5.6公斤)&#xff0c;测量速度快 户外量测&#xff1a;W-CDMA&#xff…

unity日记10(无头盔开发vr XR Device Simulator操作说明| 模之屋模型导入unity )

目录 XR Device Simulator配置参考视频 XR Device Simulator操作方法参考视频 模之屋模型导入unity参考视频 XR Device Simulator操作方法&#xff08;个人心得&#xff09; 1.摄像机 1.摄像机左右移动 右键移动鼠标 2.摄像机前后移动 右键滚动滚轮 3.摄像…

Vulnhub之HACKABLE: II

1.信息收集 使用arp-scan扫描存活网段 使用nmap对192.168.239.126进行端口扫描&#xff0c;发现存在21(可匿名登录)、22、80端口 2.漏洞发现 使用ftp 192.168.239.126进行匿名登录&#xff0c;注意&#xff1a;anonymous都要小写。执行dir命令发现CALL.html 执行get CALL…

mybatis 的mapper接口没有实现类,那么他是如何工作的

一、mybatis使用动态代理要实现的功能。 mybatis 的底层实际上运行的还是ibatis&#xff0c;即需要把接口和xml映射翻译成 ibatis 需要的这种格式。 二、mapper接口的动态代理 当使用 sqlSession.getMapper 获取一个Mapper 的时候一般是使用 sqlSession 的 DefaultSqlSession…

K_A11_006 基于STM32等单片机采集雨水模块 串口与OLED0.96双显示

K_A11_006 基于STM32等单片机采集雨水模块 串口与OLED0.96双显示一、资源说明二、基本参数参数引脚说明三、驱动说明IIC地址/采集通道选择/时序对应程序:四、部分代码说明1、接线说明1.1、STC89C52RC雨水模块1.2、STM32F103C8T6雨水模块五、基础知识学习与相关资料下载六、视频…

电脑开机找不到启动设备怎么办?

如果你的电脑弹出错误消息并提示“找不到启动的设备”&#xff0c;不用担心&#xff0c;本文将告诉你5种不同的方法&#xff0c;可以轻松修复无可引导的设备的问题&#xff01;“找不到启动设备”是什么意思&#xff1f;可引导设备&#xff08;又称启动设备&#xff09;是一种存…

Vue.js学习笔记

vue.js学习笔记 Vue.js 是一款流行的 JavaScript 前端框架&#xff0c;Vue 所关注的核心是 MVC 模式中的视图层&#xff0c;它也方便地获取数据更新&#xff0c;实现视图与模型的交互。 1.创建代码片段 声明式渲染&#xff1a;Vue.js 的核心是一个允许采用简洁的模板语法来声…

kafka开kerberos认证报错the client is being asked for a password

Kafka kerberos认证错误记录TOC kafka开发调试 kerberos认证错误记录 背景 kafka 开发调试&#xff0c;开 kerberos情况下遇到的错误。 错误日志 Could not login: the client is being asked for a password, but the Kafka client code does not currently support obta…

隐私计算主流技术

隐私计算目前主流的技术路线有三种:多方安全计算、联邦学习和TEE。 1. MPC多方安全计算 百万富翁问题: 两个富翁,分别为张三和李四,他们自己都清楚自己有几千万财产即他们心里清楚 1~10中的一个数(代表自己千万级的财富)。他们想知道到底谁的数更大一些。 1.1 MPC定义 …

【博学谷学习记录】大数据课程-学习第三周总结

1. 大数据课程导论 数据分析的前提是有数据&#xff0c;数据存储的目的是支撑数据分析。究竟怎么去存储庞大的数据量&#xff0c;是开展数据分析的企业在当下面临的一个问题。传统的数据存储模式存储容量是有大小限制或者空间局限限制的&#xff0c;怎么去设计出一个可以支撑大…

【UE4 第一人称射击游戏】49-僵尸攻击动画

上一篇&#xff1a;【UE4 第一人称射击游戏】48-僵尸死亡设置本篇效果&#xff1a;可以看到僵尸在移动到玩家面前会从移动状态转为攻击状态&#xff0c;播放相应的攻击动画。步骤&#xff1a;打开“SimpleAI”&#xff0c;删除所有和“Character看见pawn时”、“AI随机移动”的…

动态规划算法刷题笔记【背包问题】

01背包问题 dp[i-1][j]指没纳入当前物品&#xff0c;dp[i-1][j-ci]wi指纳入当前物品&#xff0c;并且是和j-ci体积下的价值作和 滚动数组优化空间复杂度 [NOIP2005 普及组] 采药 辰辰是个天资聪颖的孩子&#xff0c;他的梦想是成为世界上最伟大的医师。为此&#xff0c;他想拜…

基于jsp+mysql+Spring的Springboot旅游网站管理系统设计和实现

基于jspmysqlSpring的Springboot旅游网站管理系统设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末…

数据库操作——redis

数据库操作——redisredis介绍Redis、Mamcache/MongoDB对比分布式数据库的CAP原理redis的下载和安装安装之后的操作key操作数据类型字符串命令 string列表 list集合set哈希hashZset 有序集合持久化RDB相关的配置AOF相关的配置开启AOF共存AOF 相关的配置总结事务定义和执行事务的…

【Linux杂篇】Cron是什么?利用Cron Job自动执行定时任务

Cron Cron是一个实用程序&#xff0c;用于在特定的时间自动执行重复任务。在Linux中&#xff0c;常用 cron 服务器来完成这项工作&#xff0c;以下是Cron的工作原理&#xff1a; 如果想稍后执行特定任务一次&#xff0c;可以使用其他命令。但是&#xff0c;对于重复性任务&am…

模电视频笔记:详解直接耦合放大电路p146,3.1.1

一个图一个图的分析下来&#xff1a; 初始的电路原型 &#xff0c;这是把两个基本的共射放大电路组合了起来。 补充几个很重要的知识点&#xff0c;否则字都认识&#xff0c;但是完全看不懂在说什么&#xff1a; a、图中的晶体管是npn型晶体管。 b、这个电路是共射放大电路 c、…

产品经理如何更好的适应工作呢?

先来了解一下和产品经理相关的数据 大厂职能需求占比变化 岗位薪酬水平&岗位要求 产品经理市场需求现状 大厂喜欢招聘什么样的人&#xff1f; 无论是通过什么途径成为了一名产品经理&#xff0c;对于该岗位所需要的技能其实都是类似的&#xff0c;把产品经理需要具备的能力…