非递归实现组合型枚举、费解的开关(贪心)

非递归实现组合型枚举

题目描述

登录—专业IT笔试面试备考平台_牛客网

运行代码

#include <iostream>
#include <vector>
using namespace std;
void FN(int n, int m, vector<int>& s, int start) {
    if (s.size() == m) {
        for (int num : s) {
            cout << num << " ";
        }
        cout<<endl;
        return;
    }

    for (int i = start; i <= n; i++) {
        s.push_back(i);
        FN(n, m,s, i + 1);
        s.pop_back();
    }
}

int main() {
    int n, m;
    cin >> n >> m;
    vector<int> ss;
   FN(n, m, ss, 1);

    return 0;
}

代码思路

  • FN函数使用回溯法来生成从1n中选m个数的所有组合。
  • 当组合的长度达到m时,就输出该组合。
  • 通过一个循环从当前起始位置开始尝试添加每个数到组合中,然后递归调用自身继续生成,最后弹出刚才添加的数进行回溯。

改进思路

添加一些边界条件判断来增强代码的健壮性

改进代码

#include <iostream>
#include <vector>
using namespace std;

void FN(int n, int m, vector<int>& s, int start) {
    if (s.size() == m) {
        for (int num : s) {
            cout << num << " ";
        }
        cout << endl;
        return;
    }

    if (start > n) { // 添加边界条件判断
        return;
    }

    for (int i = start; i <= n; i++) {
        s.push_back(i);
        FN(n, m, s, i + 1);
        s.pop_back();
    }
}

int main() {
    int n, m;
    cin >> n >> m;
    vector<int> ss;
    FN(n, m, ss, 1);

    return 0;
}

费解的开关

题目描述

登录—专业IT笔试面试备考平台_牛客网

运行代码

#include <cstring>
#include <iostream>
using namespace std;
const int N = 6;
int a[N], ans, aa[N];
char s[N];

void dj(int x, int y) {
	aa[x] ^= (1 << y);
	if (x != 1) aa[x-1] ^= (1 << y);
	if (x != 5) aa[x+1] ^= (1 << y);
	if (y != 0) aa[x] ^= (1 << (y - 1));
	if (y != 4) aa[x] ^= (1 << (y + 1));
}

void pd(int p) {
	int k = 0;
	memcpy(aa, a, sizeof(a));
	for (int i = 0; i < 5; i++)
		if (!((p >> i) & 1)) {
			dj(1, i);
			if (++k >= ans) return;
		}
	for (int x = 1; x < 5; x++)
		for (int y = 0; y < 5; y++)
			if (!((aa[x] >> y) & 1)) {
				dj(x + 1, y);
				if (++k >= ans) return;
			}
	if (aa[5] == 31) ans = k;
}

void abc() {
	memset(a, 0, sizeof(a));
	for (int i = 1; i <= 5; i++) {
		cin >> (s + 1);
		for (int j = 1; j <= 5; j++) a[i] = (a[i] << 1)+ (s[j] - '0');
	}
	ans = 7;
	for (int p = 0; p < (1 << 5); p++) pd(p);
	if (ans == 7) cout << "-1" << endl;
	else cout << ans << endl;
}

int main() {
	int n;
	cin >> n;
	while (n--) abc();
	return 0;
}

代码思路

  1. 变量定义:

    • N = 6 表示处理的数组大小,但实际上代码逻辑暗示着处理的是一个5x5的矩阵,因为有for (int i = 0; i < 5; i++)这样的循环。
    • a[N] 和 aa[N] 是两个整型数组,用于存储当前状态和操作后的状态,每个元素用一个整数的低5位表示矩阵的一行,其中1表示灯亮,0表示灯灭。
    • ans 存储最小的操作步数。
    • s[N] 用于读取输入的字符串。
  2. 函数dj (toggle):对矩阵的一个位置(x, y)执行开关操作,并同时影响其上、下、左、右的邻居。这里使用位异或操作(1 << y)来翻转指定位置的灯的状态,以及其相邻的位置。

  3. 函数pd (processDirection):接受一个方向选择参数p,该参数决定哪些初始位置的灯应该被操作。通过遍历所有可能的方向组合,调用dj函数进行状态转换,并记录操作步数k。如果某次操作使得最后一行(索引为5)的所有灯都亮起(aa[5] == 31),则更新ans为当前的步数k

  4. 函数abc (solveProblem):

    • 读取输入,将字符矩阵转化为二进制表示的整数数组a
    • 初始化ans为最大可能步数7,然后对所有可能的初始操作组合调用pd函数。
    • 最后,输出最小操作步数或-1表示无解。
  5. main函数:读取测试用例数量n,然后循环调用abc函数处理每个案例。

通过位操作高效地表示和操作状态,并利用穷举法探索所有可能的解来找到最小操作次数。

改进思路

  1. 减少全局变量的使用:全局变量容易导致代码可读性差,且在多线程环境下可能引起并发问题。尽量将全局变量转为局部变量或通过参数传递。

  2. 使用更直观的变量名:提高代码的可读性,让其他人更容易理解代码的意图。

  3. 减少内存拷贝memcpy(aa, a, sizeof(a))在每次递归调用中都发生,可以考虑直接操作原数组或使用引用避免拷贝。

  4. 利用位操作的特性进行优化:充分利用位操作的高效性,减少不必要的循环和条件判断。

  5. 提前终止条件:在递归搜索中尽早判断是否达到目标状态,减少无效计算。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SM481,SM432和利时DCS备件

SM481,SM432和利时DCS备件。POU名只能包含字母、数字、下划线&#xff0c;第一个字符必须是字母或者下划线&#xff0c;且遵循以下原则&#xff1a;SM481,SM432和利时DCS备件。关于重名&#xff0c;不能与变量名、变量组名、POU文件夹名、任务名、SM481,SM432和利时DCS备件。工…

算法类学习笔记 —— 典型卷积神经网络

文章目录 介绍LetNet填充&步长&通道数填充步长通道数卷积层池化层全连接层激活函数常见的激活函数Sigmoid函数tanh函数ReLU激活函数LReLUPReLUSwish softmax分类 AlexNetVGGNetGoogleNetResNetDenseNetSENet 介绍 现有的卷积神经网络的结构可以按照下图机型分类&#x…

项目3:从0开始的RPC框架(扩展版)

一. 全局配置加载 1. 需求分析 通常情况下&#xff0c;在RPC框架运行的会涉及到多种配置信息&#xff0c;比如注册中心的地址、序列化方式、网络服务端接口号等。 在简易版框架中&#xff0c;硬编码了这些配置&#xff0c;也就是都写死了&#xff0c;在真实的应用环境中是不…

Halcon 双相机标定与拼图(二)

一、概述 这种标定有两种模式&#xff0c;有一个标定板和多个标定板两种 一个标定板 两个相机的重叠区域比较大&#xff0c;那么我们可以把标定板放到那个重叠区域来统一坐标系&#xff0c;如下 这种是只需要一个标定板&#xff0c;这种是推荐的方式 。这种是比较简单的&…

【JAVASE】日期与时间类(下)

三&#xff1a;LocalDateTime 相当于LocalDate类&#xff0c;在LocalDateTime类的对象中还可以封装时、分、秒和纳秒&#xff08;1纳秒是1秒的十亿分之一&#xff09;等时间类型。 例如&#xff0c;创建LocalDateTime对象 &#xff0c; LocalDateTime date LocalDateTi…

基本算法-枚举、模拟、递推(上)

目录 递归实现指数型枚举 题目描述 运行代码 代码思路 递归实现组合型枚举 题目描述 运行代码 代码思路 递归实现排列型枚举 题目描述 运行代码 代码思路 递归实现指数型枚举 题目描述 登录—专业IT笔试面试备考平台_牛客网 运行代码 #include<iostream> …

netty+springboot+vue聊天室(需要了解netty)

先看看这个使用websocket实现的聊天室&#xff0c;因为前端是使用websocket&#xff0c;和下面的demo的前端差不多就不解释实现原理&#xff0c;所以建议还是看看(要是会websocket的大佬请忽略) springbootwebsocketvue聊天室 目录 一、实现内容二、代码实现1.后端2.前端源码…

Java--命令行传参

1.有时你希望运行一个程序时再传递给它消息&#xff0c;这要靠传递命令行参数给main&#xff08;&#xff09;函数实现 2.选中文件右键找到如图选项并打开 3.在文件地址下输入cmd空格符号&#xff0c;再按回车调出命令窗口 4.如图一步步进行编译&#xff0c;在向其传入参数&…

什么情况下需要配戴助听器

以下几种情况需要考虑配戴助听器&#xff1a; 1、听力无波动3个月以上的感音神经性听力障碍。如:先天性听力障碍、老年性听力障碍、噪声性听力障碍、突聋的稳定期等&#xff0c;均可选配合适的助听器。 2、年龄方面。使用助听器没有严格的年龄限制&#xff0c;从出生数周的婴…

【Python】解决Python报错:ValueError: not enough values to unpack (expected 2, got 1)

​​​​ 文章目录 引言1. 错误详解2. 常见的出错场景2.1 函数返回值解包2.2 遍历含有不同长度元组的列表 3. 解决方案3.1 检查和调整返回值3.2 安全的解包操作 4. 预防措施4.1 使用异常处理4.2 单元测试 结语 引言 在Python编程中&#xff0c;ValueError 是一个常见的异常类…

win10重装系统?电脑系统重装一键清晰,干货分享!

在电脑的使用过程中&#xff0c;由于各种原因&#xff0c;我们可能会遇到系统崩溃、运行缓慢或者出现各种难以解决的问题。这时&#xff0c;重装系统往往是一个有效的解决方案。今天&#xff0c;我们就来详细介绍一下如何在Win10环境下进行系统的重装&#xff0c;帮助大家轻松解…

springboot+mqtt使用总结

1.软件的选型 1.1.使用免费版EMQX 1.1.1.下载 百度搜索的目前是会打开官网&#xff0c;这里提供下免费版的使用链接EMQX使用手册 文档很详细&#xff0c;这里不再记录了。 1.2.使用rabbitmq rabbitmq一般做消息队列用&#xff0c;作为mqtt用我没有找到详细资料&#xff0c…

[AIGC] SpringBoot的自动配置解析

下面是一篇关于SpringBoot自动配置的文章&#xff0c;里面包含了一个简单的示例来解释自动配置的原理。 SpringBoot的自动配置解析 Spring Boot是Spring的一个子项目&#xff0c;用于快速开发应用程序。它主要是简化新Spring应用的初始建立以及开发过程。其中&#xff0c;自动…

武汉理工大学 云计算与服务计算 期末复习

云计算与的定义 长定义是&#xff1a;“云计算是一种商业计算模型。它将计算任务分布在大量计算机构成的资源池上&#xff0c;使各种应用系统能够根据需要获取计算力、存储空间和信息服务。” 短定义是&#xff1a;“云计算是通过网络按需提供可动态伸缩的廉价计算服务。 云计…

批量转换更高效:一键修改TXT后缀名转DOCX,轻松实现文件高效管理!

在日常生活和工作中&#xff0c;我们经常需要处理大量的文件&#xff0c;而文件格式的转换和管理往往是其中一项繁琐的任务。特别是当需要将大量的TXT文件转换为DOCX格式时&#xff0c;传统的逐个手动操作不仅效率低下&#xff0c;还容易出错。然而&#xff0c;现在有了我们这款…

【ArcGIS微课1000例】0117:ArcGIS中如何将kml(kmz)文件转json(geojson)?

文章目录 一、kml获取方式二、kml转图层三、图层转json一、kml获取方式 kml文件是一种很常用的数据格式,可以从谷歌地球(googleearth)获取某一个地区的kml范围文件,如青海湖(做好的kml文件可以从配套实验数据包0117.rar中获取)。 二、kml转图层 打开【KML转图层】工具,…

在线渲染3d怎么用?3d快速渲染步骤设置

在线渲染3D模型是一种高效的技术&#xff0c;它允许艺术家和设计师通过互联网访问远程服务器的强大计算能力&#xff0c;从而加速渲染过程。无论是复杂的场景还是高质量的视觉效果&#xff0c;在线渲染服务都能帮助您节省宝贵的时间。 在线渲染3D一般选择的是&#xff1a;云渲染…

数据结构之初识泛型

目录&#xff1a; 一.什么是泛型 二.引出泛型 三.泛型语法及&#xff0c;泛型类的使用和裸类型(Raw Type) 的了解 . 四.泛型的编译&#xff1a; 五.泛型的上界 六.泛型方法 注意&#xff1a;在看泛型之前可以&#xff0c;回顾一下&#xff0c;包装类&#xff0c;包装类就是服务…

【Python预处理系列】深入理解过采样技术及其Python实现

目录 一、过采样简介 二、过采样的实现方法 三、过采样和欠采样是数据增强吗 四、Python实现SMOTE过采样 &#xff08;一) 生成不平衡数据集 &#xff08;二&#xff09; 将数据集转换为DataFrame&#xff0c;便于展示 &#xff08;三) 应用SMOTE算法进行过采样 &…

命令行打包最简单的android项目从零开始到最终apk文件

准备好需要的工具 AndroidDevTools - Android开发工具 Android SDK下载 Android Studio下载 Gradle下载 SDK Tools下载 jdk的链接我就不发出来,自己选择,我接下来用的是8版本的jdk和android10的sdk sdk的安装和环境变量的配置 sdk tool压缩包打开后是这样子,打开sdk mana…