C语言 全排列(包含错误代码及分析,memset简单介绍及举例)

news2025/1/13 10:58:23

正确代码:

#include <stdio.h>
#include <math.h>
#include <string.h>

int n;//表示位数
int a[10];
int hash_tabel[10];

void print()
{
    for(int i=n;i>0;i--)
        printf("%d",a[i]);
    printf("\n");
}
void core(int d)
{
    if(d==0)//排序完成
    {
        print();
        return ;
    }
    for(int i=1;i<=n;i++)
    {
        if(!hash_tabel[i])
        {
            a[d]=i;
            hash_tabel[i]=1;
            core(d-1);
            hash_tabel[i]=0;
        }
    }
}

int main()
{
    int num;
    scanf("%d",&n);
    core(n);
    return 0;
}

题目来源:

河北大学数据结构与算法第四版教科书P21 题目2。

代码分析:

没有用书上的方法,交换啥的,没想明白,这个代码的基本方法是置入。

基本思路是递归,从1到n依次尝试填入目标位置,在解决当前位置后继续解决下一位置,直到最后一个位置也填好数据,即解决了一种情况,注意在子问题解决后要将 hash_tabel[i]置零还原。

错误代码:

#include <stdio.h>
#include <math.h>
#include <string.h>

int n;//表示位数
int a[10];
int hash_tabel[10];

void init_hash()
{
    memset(hash_tabel,0,sizeof(hash_tabel) );
}

void print()
{
    for(int i=n;i>0;i--)
        printf("%d",a[i]);
    printf("\n");
}

void core(int d)
{
    if(d==0)//排序完成
    {
        print();
        init_hash();//错误点1
        return ;
    }
    for(int i=1;i<=n;i++)
    {
        if(!hash_tabel[i])
        {
            a[d]=i;
            hash_tabel[i]=1;
            core(d-1);
            //错误点2
        }
    }
}

int main()
{
    int num;
    scanf("%d",&n);
    core(n);
    return 0;
}

错误代码分析:

这个是我一开始写出来的代码,主要问题是在解决子问题后没有还原散列,先上错误运行结果:

可以看出一个数值多次出现,一开始我还以为是散列的问题,没有正确初始化,修改了之后还是有问题,后来才想到是子问题解决后没有正确进入下一状态,看如下运行模拟:

输入值 3

进入core函数 当前位置 3 状态1
i=1 a[3]=1 hash[1]=1 递归调用core

进入core函数 当前位置 2 状态2
i=1 无法置入(hash[1]=1)
i=2  a[2]=2 hash[2]=1 递归调用core

进入core函数 当前位置 1 状态3
i=1 无法置入
i=2 无法置入
i=3  a[1]=3 hash[3]=1 递归调用core

进入core函数 当前位置 0 状态4
重置hash为0 退出core 打印 1 2 3

此时回退到 状态3
i=4 退出core

回退到 状态2
i=3 a[2]=3 hash[3]=1 递归调用core

进入core函数 当前位置 1 状态5
i=1  a[1]=1 hash[1]=1 递归调用core

进入core函数 当前位置 0 状态6
重置hash为0 退出core 打印 1 3 1

可以看出问题出在hash的处理上,在最后输出时初始化hash导致在某一状态的子问题解决后处理下一状态时hash是完全错的,正确处理方式应该是当回退到某一状态后同时将hash状态也回退,即正确代码第29行。

另memset用法简记:

头文件:

#include <string.h>

用途:

将数组存储位置以字节为单位进行赋值

函数原型:

void*memset(void* dest ,int c ,size_t count );

参数:

Parameters
dest
Pointer to destination
c
Character to set
count
Number of characters

用法:

我比较常用的是将int数组内容置0,也可以直接置-1,下面举例:

int hash_tabel[10];
memset(hash_tabel,0,sizeof(hash_tabel) );        //写法1
memset(hash_tabel,0,sizeof(hash_tabel[0])*10 );  //写法2

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

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

相关文章

Linux使用ACL控制对文件的访问

文章目录1. 查看文件ACL2. 解释文件ACL3. 更改ACL文件权限setfacl命令1) 以递归方式更新现有 cases 目录及其内容。2) 以递归方式更新现有cases 目录及其内容。3) 为contractors 组成员更新默认权限。默认权限为读取、写入和执行3.1.4) 为contractor3用户更新默认权限。默认权限…

ssm权限管理系统2

PageHelper 直接使用maven在pom.xml中添加依赖就行 在我们这个ssm管理项目中&#xff0c;已经添加了依赖包 在Springp配置文件中配置拦截器插件 正式使用 我们只需要在调用dao的方法之前插入如下语句就行&#xff0c;也就是说在service层里面进行插入 当然了上面的pageNum与pag…

ssh公钥配置,使用git从github上拉取、上传项目

一、ssh公钥配置若在以下某个步骤出现问题&#xff1a;Please make sure you have the correct access rights and the repository exists 则按本节方法重新配置ssh。删除C:\Users\Administrator\.ssh下的所有文件在桌面右击&#xff0c;选择Git Bash Here# 1.设置用户名 git c…

万字讲解Linux常用指令

目录 前言&#xff1a; 一、Linux界面问题 二、什么是操作系统 三、为什么学习Linux基本指令 四、Linux基础指令 pwd命令 ls指令 认识一下ls -a&#xff1a; 认识一下ls -d&#xff1a; 理解文件 cd指令 4.touch指令 5.mkdir指令 6.rmdir指令和rm指令 7.man指令 8.cp指令 9.mv指…

自动驾驶中3D目标检测综述

1 背 景 1.1 3D目标检测 3D目标检测是通过输入传感器数据&#xff0c;预测3D目标的属性信息的任务。如何表示3D目标的属性信息是关键&#xff0c;因为后续的预测和规划需要这些信息。在大部分情况下&#xff0c;3D目标被定义为一个立方体&#xff0c;(x,y,z)是立方体的中心坐…

stm32mp1 uboot启动流程分析

stm32mp1 uboot启动流程分析 本节主要关注uboot启动linux的流程&#xff0c;首先关注下uboot的环境变量 uboot环境变量 进入uboot以后回车输入print即可看到uboot的所有环境变量&#xff1a; 这里很多变量嵌套了一些流程&#xff0c;整理一下格式&#xff1a; altbootcmdru…

实现系统调用

文章目录前言前置知识实验操作实现一实验二实验三实验四实验五前言 博客记录《操作系统真象还原》第十二章实验的操作~ 实验环境&#xff1a;ubuntu18.04VMware &#xff0c; Bochs下载安装 实验内容&#xff1a; 实现系统调用。实现write系统调用。实现printf。 3.1 仅支持…

Simulink 自动代码生成电机控制:关于无传感控制开环启动控制的仿真和开发板运行

目录 开环启动原理 开环启动建模实现 开环启动仿真 代码生成和验证 总结 开环启动原理 永磁同步电机开环三步启动是比较传统也是比较常用的启动方式&#xff0c;典型的启动有&#xff1a; 对齐&#xff1a;也说是说的转子预定位&#xff0c;就是通过手动给定一个初始角度…

mybatis 初始化加载xml解析

一、标题解析xml 的三大对象&#xff1a;XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder XMLConfigBuilder 会把mybatis-config.xml所有元素进行解析。当碰到mappers时&#xff0c;会进行遍历。mappers中有几个mapper&#xff0c;就会创建几个XMLMapperBuilder 去进…

【Day3】链表理论基础、203移除链表元素、707设计链表、206反转链表

【Day3】链表理论基础、203移除链表元素、707设计链表、206反转链表链表理论基础链表的类型链表的存储方式链表的定义链表的操作203 移除链表元素设置虚拟头节点无虚拟头节点707设计链表206反转链表双指针法递归法while和for链表理论基础 链表是一种通过指针串联在一起的线性结…

C++版Android实时投屏软件系统源码,安卓手机投屏软件源码,无需root权限

QtScrcpy QtScrcpy 可以通过 USB / 网络连接Android设备&#xff0c;并进行显示和控制。无需root权限。 同时支持 GNU/Linux &#xff0c;Windows 和 MacOS 三大主流桌面平台。 完整代码下载地址&#xff1a;C版Android实时投屏软件系统源码 它专注于: 精致 (仅显示设备屏幕…

sentence-transformers(SBert)中文文本相似度预测(附代码)

前言 训练文本相似度数据集并进行评估&#xff1a;sentence-transformers(SBert)预训练模型&#xff1a;chinese-roberta-wwm-ext数据集&#xff1a;蚂蚁金融文本相似度数据集前端&#xff1a;Vue2elementuiaxios后端&#xff1a;flask 训练模型 创建网络&#xff1a;使用Sb…

c语言公司考勤系统

1.要求 考勤系统是公司人事管理重要环节&#xff0c;用于记录员工迟到、早退、缺席、请假等出勤情况&#xff0c;并能提供数据统计功能。系统需求如下: 认证用户&#xff0c;如密码方式; 设置上下班时间&#xff0c;并能判断是否迟到、早退; 记录出勤状况&#xff0c;能记录每日…

基础IO(2)--文件描述符以及输入输出重定向

文件描述符fd 文件操作的本质是进程和被打开文件的关系。 进程可以打开多个文件&#xff0c;这些被打开的文件由OS管理&#xff0c;所以操作系统必定要为文件创建对应的内核数据结构标识文件–struct file{}【与C语言的FILE无关】 通过如下程序 #include <stdio.h> #…

uni-app在真机调试下兼容ethers的方法

目录 一、安装ethers 二、renderjs 三、注意事项 uni-app开发跨平台应用程序&#xff0c;项目搭建主要前端框是Uni-app Vue3 TS Vite&#xff0c;项目搭建参考文章Uni-app Vue3 TS Vite 创建项目 Hbuilderx版本是3.6.17 一、安装ethers yarn add ethers 如果像ether…

【Python】用xpath爬取2022热梗保存到txt中并生成词云

本文收录于《python学习笔记》专栏&#xff0c;这个专栏主要是我学习Python中遇到的问题&#xff0c;学习的新知识&#xff0c;或总结的一些知识点&#xff0c;我也是初学者&#xff0c;可能遇到的问题和大部分新人差不多&#xff0c;在这篇专栏里&#xff0c;我尽可能的分享出…

MySQL 索引 学习

索引 主键索引&#xff08;PRIMARY KEY&#xff09; 唯一标识&#xff0c;主键不可重复&#xff0c;只能有一个主键 唯一索引&#xff08;UNIQUE KEY&#xff09; 索引列 常规索引&#xff08;KEY/INDEX&#xff09;全文索引&#xff08;FullText&#xff09; 可以快速定位数据…

excel拆分技巧:如何快速对金额数字进行分列

金额数字分列&#xff0c;相信是做财务的小伙伴们经常遇到的问题。网上关于金额数字分列的方法很多&#xff0c;但用到的公式大都比较复杂。今天我们就来分享一个最简单的公式&#xff0c;仅用LEFT、RIGHT和COLUMN三个函数&#xff0c;就能达到效果&#xff01;在财务工作中&am…

Tapdata Cloud 场景通关系列:将数据导入阿里云 Tablestore,获得毫秒级在线查询和检索能力

【前言】作为中国的 “Fivetran/Airbyte”, Tapdata Cloud 自去年发布云版公测以来&#xff0c;吸引了近万名用户的注册使用。应社区用户上生产系统的要求&#xff0c;Tapdata Cloud 3.0 将正式推出商业版服务&#xff0c;提供对生产系统的 SLA 支撑。Tapdata 目前专注在实时数…

【论文阅读 CIKM2014】Extending Faceted Search to the General Web

文章目录ForewordMotivationMethodQuery facet generation:Facet feedbackEvaluationForeword This paper is from CIKM 2014, so we only consider the insightsI have read this paper last month and today i share this blogThere are many papers that have not been sha…