Leecode刷题C语言之N皇后②

执行结果:通过

执行用时和内存消耗如下:

 

struct hashTable {int key;UT_hash_handle hh;
};struct hashTable* find(struct hashTable** hashtable, int ikey) {struct hashTable* tmp = NULL;HASH_FIND_INT(*hashtable, &ikey, tmp);return tmp;
}void insert(struct hashTable** hashtable, int ikey) {struct hashTable* tmp = NULL;HASH_FIND_INT(*hashtable, &ikey, tmp);if (tmp == NULL) {tmp = malloc(sizeof(struct hashTable));tmp->key = ikey;HASH_ADD_INT(*hashtable, key, tmp);}
}void erase(struct hashTable** hashtable, int ikey) {struct hashTable* tmp = NULL;HASH_FIND_INT(*hashtable, &ikey, tmp);if (tmp != NULL) {HASH_DEL(*hashtable, tmp);free(tmp);}
}struct hashTable *columns, *diagonals1, *diagonals2;int backtrack(int n, int row) {if (row == n) {return 1;} else {int count = 0;for (int i = 0; i < n; i++) {if (find(&columns, i) != NULL) {continue;}int diagonal1 = row - i;if (find(&diagonals1, diagonal1) != NULL) {continue;}int diagonal2 = row + i;if (find(&diagonals2, diagonal2) != NULL) {continue;}insert(&columns, i);insert(&diagonals1, diagonal1);insert(&diagonals2, diagonal2);count += backtrack(n, row + 1);erase(&columns, i);erase(&diagonals1, diagonal1);erase(&diagonals2, diagonal2);}return count;}
}int totalNQueens(int n) {columns = diagonals1 = diagonals2 = NULL;return backtrack(n, 0);
}

解题思路:

这段代码是用来解决经典的N皇后问题的,它利用了哈希表来高效地存储和查询在N皇后问题中已经被占用的列、主对角线和副对角线的信息。下面是代码的详细思路:

数据结构定义

  1. 哈希表结构
    • struct hashTable:定义了一个哈希表节点,包含一个整型key用于存储列、主对角线或副对角线的标识符,以及一个UT_hash_handle hh,这是uthash库用来管理哈希表节点的内部字段。

哈希表操作函数

  1. 查找函数find
    • 输入:指向哈希表头指针的指针hashtable和要查找的键ikey
    • 功能:在哈希表中查找键为ikey的节点。
    • 输出:返回找到的节点指针,如果未找到则返回NULL
  2. 插入函数insert
    • 输入:指向哈希表头指针的指针hashtable和要插入的键ikey
    • 功能:如果哈希表中不存在键为ikey的节点,则创建一个新节点并插入到哈希表中。
    • 输出:无。
  3. 删除函数erase
    • 输入:指向哈希表头指针的指针hashtable和要删除的键ikey
    • 功能:从哈希表中删除键为ikey的节点,并释放该节点的内存。
    • 输出:无。

解决N皇后问题的函数

  1. 回溯函数backtrack
    • 输入:棋盘的大小n和当前正在放置皇后的行row
    • 功能:尝试在每一行放置一个皇后,并递归地尝试放置下一行的皇后,直到所有行都成功放置了皇后(即找到一个解),或者所有可能的放置方式都尝试完毕。
    • 辅助数据结构:使用三个哈希表columnsdiagonals1diagonals2分别记录被占用的列、主对角线和副对角线的标识符。
    • 输出:返回找到的解的数量。
  2. 主函数totalNQueens
    • 输入:棋盘的大小n
    • 功能:初始化三个哈希表,并调用回溯函数backtrack开始求解。
    • 输出:返回N皇后问题的解的总数。

解决方案思路

  • 初始化:创建三个哈希表来跟踪哪些列、主对角线和副对角线已被占用。
  • 回溯:对于每一行,尝试在该行的每一列放置一个皇后。
    • 检查当前列是否已被占用。
    • 计算当前位置所在的主对角线和副对角线的标识符,并检查它们是否已被占用。
    • 如果当前位置可行(即所在列、主对角线和副对角线都未被占用),则标记这些位置为已占用,并递归地尝试放置下一行的皇后。
    • 如果成功放置了所有行的皇后,则找到一个解,增加解计数器。
    • 回溯时,撤销对当前位置及其所在列、主对角线和副对角线的占用标记。
  • 结果:通过回溯所有可能的放置方式,最终得到N皇后问题的解的总数。

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

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

相关文章

vue跳转以及传参

1.跳转页面的三种方法 <template><button click"twopage">跳转</button> </template><script setup> import { useRouter } from "vue-router"; const router useRouter(); // 获取 router 实例const twopage () > {r…

EasyMedia播放rtsprtmp视频流(flvhls)

学习链接 MisterZhang/EasyMedia - gitee地址 EasyMedia转码rtsp视频流flv格式&#xff0c;hls格式&#xff0c;H5页面播放flv流视频 EasyMedia播放rtsp视频流&#xff08;vue2、vue3皆可用&#xff09; EasyMedia转码rtsp视频流flv格式&#xff0c;hls格式&#xff0c;H5页…

用 React 编写一个笔记应用程序

这篇文章会教大家用 React 编写一个笔记应用程序。用户可以创建、编辑、和切换 Markdown 笔记。 1. nanoid nanoid 是一个轻量级和安全的唯一字符串ID生成器&#xff0c;常用于JavaScript环境中生成随机、唯一的字符串ID&#xff0c;如数据库主键、会话ID、文件名等场景。 …

利用 Redis 与 Lua 脚本解决秒杀系统中的高并发与库存超卖问题

1. 前言 1.1 秒杀系统中的库存超卖问题 在电商平台上&#xff0c;秒杀活动是吸引用户参与并提升销量的一种常见方式。秒杀通常会以极低的价格限量出售某些商品&#xff0c;目的是制造紧迫感&#xff0c;吸引大量用户参与。然而&#xff0c;这种活动的特殊性也带来了许多技术挑…

机器学习8-决策树CART原理与GBDT原理

CART决策树算法流程举例 该篇文章对于CART的算法举例讲解&#xff0c;一看就懂。 决策树(Decision Tree)—CART算法 同时也可以观看视频 分类树 GBDT原理举例 可以看如下示例可以理解GBDT的计算原理 用通俗易懂的方式讲解&#xff1a; GBDT算法及案例&#xff08;Python 代…

【Linux探索学习】第十八弹——进程等待:深入解析操作系统中的进程等待机制

Linux学习笔记&#xff1a;https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言&#xff1a; 在Linux操作系统中&#xff0c;进程是资源的管理和执行单元&#xff0c;每个进程都有其自己的生命周期。在进程的执行过程中&#xff0c;进程…

大数据技术Kafka详解 ② | Kafka基础与架构介绍

目录 1、kafka的基本介绍 2、kafka的好处 3、分布式发布与订阅系统 4、kafka的主要应用场景 4.1、指标分析 4.2、日志聚合解决方法 4.3、流式处理 5、kafka架构 6、kafka主要组件 6.1、producer(生产者) 6.2、topic(主题) 6.3、partition(分区) 6.4、consumer(消费…

嵌入式Linux之wifi配网脚本分析

嵌入式Linux系统,一般都支持wifi联网,可以通过sh脚本或其它语言代码编程来实现wifi联网。 本篇来介绍一种通过sh脚本来配置wifi的脚本执行原理。 1 sh脚本wifi联网介绍 这里以飞凌开发板中的wifi启动脚本为例来介绍。 在飞凌开发板的串口中,执行如下命令(调用fltest_wif…

如何通过 JWT 来解决登录认证问题

1. 问题引入 在登录功能的实现中 传统思路&#xff1a; 登录页面时把用户名和密码提交给服务器服务器验证用户名和密码&#xff0c;并把检验结果返回给后端如果密码正确&#xff0c;则在服务器端创建 session&#xff0c;通过 cookie 把 session id 返回给浏览器 但是正常情…

【Linux】文件操作的艺术——从基础到精通

&#x1f3ac; 个人主页&#xff1a;谁在夜里看海. &#x1f4d6; 个人专栏&#xff1a;《C系列》《Linux系列》《算法系列》 ⛰️ 道阻且长&#xff0c;行则将至 目录 &#x1f4da;前言&#xff1a;一切皆文件 &#x1f4da;一、C语言的文件接口 &#x1f4d6;1.文件打…

Redis数据库详解

文章目录 Redis数据库1 Redis概述1.1 Redis介绍1.2 Redis特点1.3 应用场景1.4 Redis版本1.5 Redis附加功能1.6 Redis安装1.6.1 Rocky Linux操作系统1.6.2 Windows操作系统1.6.3 Mac操作系统 2 配置文件详解3 数据类型3.1 字符串String3.1.1 字符串3.1.2 数值 3.2 列表List3.3 H…

FFmpeg 4.3 音视频-多路H265监控录放C++开发十八,ffmpeg解封装

为啥要封装和解封装呢&#xff1f; 1.封装就相当于将 h264 和aac 包裹在一起。既能播放声音&#xff0c;也能播放视频 2.在封装的时候没指定编码格式&#xff0c;帧率&#xff0c;时长&#xff0c;等参数&#xff1b;特别是视频&#xff0c;可以将视频帧索引存储&#xff0c;…

JAVA |日常开发中常见问题归纳讲解

JAVA &#xff5c;日常开发中常见问题归纳讲解 前言一、语法错误相关问题1.1 分号缺失或多余1.2 括号不匹配1.3 变量未定义或重复定义 二、数据类型相关问题2.1 数据类型不匹配2.2 整数溢出和浮点数精度问题 三、面向对象编程相关问题3.1 空指针异常&#xff08;NullPointerExc…

Git常用命令参考手册

Git常用命令参考手册 整理了一篇git常用的命令参考手册&#xff0c;命令顺序按照一个项目从头到尾的常用命令顺序做了排序&#xff0c;后续会继续完善内容示例并补全其他命令使用说明&#xff0c;希望对不熟悉的小伙伴有所帮助。 git config # 配置列表 git config --list #…

翰高4.5.7安装测试手册centos

翰高4.5.7centos版本安装 1 环境准备 产品包&#xff1a;hgdb4.5.7-see-centos7-x86-64-20210804.rpm 环境&#xff1a;10.1.5.172 root/sh88861158 操作系统安装完成后&#xff0c;执行常规操作&#xff1a;修改hosts、关闭防火墙、关闭senliunx 2 安装步骤 2.1 安装前准…

港科夜闻 |香港科大推出 InvestLM生成式人工智能平台,支持金融中小企应用AI技术潜力...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大推出 InvestLM生成式人工智能平台&#xff0c;支持金融中小企应用AI技术潜力。香港科大商学院继去年研究团队成功开发本港首个专为金融界而设、应用于生成式人工智能(生成式AI)的开源大语言模型InvestLM后&#…

【计算机网络】实验6:IPV4地址的构造超网及IP数据报

实验 6&#xff1a;IPV4地址的构造超网及IP数据报 一、 实验目的 加深对IPV4地址的构造超网&#xff08;无分类编制&#xff09;的了解。 加深对IP数据包的发送和转发流程的了解。 二、 实验环境 • Cisco Packet Tracer 模拟器 三、 实验内容 1、了解IPV4地址的构造超网…

全面解析 C++ STL 中的 set 和 map

C 标准模板库&#xff08;STL&#xff09;中的关联式容器以其强大的功能和高效性成为开发者解决复杂数据组织问题的重要工具。其中&#xff0c;set 和 map 是最常用的两类关联容器。本篇博客将从基本特性、底层实现、用法详解、高级案例以及性能优化等多个角度&#xff0c;详细…

FreeRtos开发之计数信号量

前面介绍过了计数信号量的定义取值只有0与1两种状态的信号量称之为二值信号量 取值大于1的信号量称之为计数信号量 计数信号量的取值也可以为1&#xff0c;但通常大于1&#xff0c;如果取值为1&#xff0c;相当于只有0与1两种状态&#xff0c;用二值信号量即可。 计数信号量应用…

Profinet转EtherNet/IP网关是如何解决西门子S7-1500PLC与AB PLC的通讯问题的

一、 案例背景 在一个工业现场&#xff0c;一端是AB的PLC&#xff0c;IP地址192.168.1.20;另一端西门子是S7-1500系列&#xff0c;IP地址192.168.2.248。AB的PLC内有 B3、N7、F8 三个寄存器文件涉及到通讯&#xff0c;分别对应西门子PLC的M、DB1、DB2三个存储区域。通过捷米特…