数织求解脚本技术文档

目录

前言

一、脚本概述

二、核心设计思路

1. 技术路线

三、核心模块说明

1. 预生成查表字典模块(pregenPermDict函数)

功能

实现逻辑

输入输出

2. 复杂度计算模块(calculateComplexity函数)

功能

复杂度分层规则

实现逻辑

3. 行 / 列处理核心模块(processLineWithLookup函数)

功能

实现流程

关键代码(位运算修复)

4. 迭代控制模块

功能

核心逻辑

四、使用说明

1. 前置条件

2. 参数调整

3. 运行流程

五、效果验证

六、后续优化方向

代码传送门

实战效果


前言

之前我们介绍了小游戏图案生成的代码,今天我们来求解。传送门

前后给AI提了很多需求,第一天AI给出的程序求解出来给我全部铺满了。最后是给了AI几百字的程序设计提示才完成。这里摘要两段给AI的算法设计思路。

献丑!

1好的,我们继续。目前你生成的还是不对。我重新给一下整体算法思路设计。迭代有大迭代和小迭代。大迭代包括15次行迭代和15次列迭代。每次迭代只标注确定的0和1。每次迭代可以利用之前标注的0和1,来确定新的0和1,每次迭代只能修改不确定的量,变为0或者1。不限制每次迭代修改格子状态的次数。最关键的是每次迭代的设计,要求必须只能修改确定的格子,为此需要引入每行或每列的复杂度。复杂度的计算依据未确定的格子数和数字的构成,比如某一行有15个格子没有确定,但是数字是14,复杂度很低。如果数字是1 3 1,那就很复杂了。随着格子确定越来越多,复杂度会逐渐降低。我们优先处理复杂度低的迭代,复杂度高的迭代可以暂时跳过等待其他迭代更新更多的格子。如果一整个大迭代你都没有更新任何格子,你可以跳出说明太复杂,我们后续优化。核心是你可以解不出,但是不要给出错误答案,这样我们可以逐步改进求解算法。

2 计算复杂度函数大致对的,你的迭代可以不用排序,就按顺序迭代每一行,每次迭代的时候计算复杂度就可以了,复杂度过高就不用更新当前行或列,我给你个阈值5吧,当所有行列的阈值都超过5时,你不用更新任何格子,结束迭代输出当前问题过于困难,之后我慢慢调整。在复杂度低的迭代中,我建议你使用遍历的方式,查找确定的格子,2的15次不算多,你可以生成一个表,为2的15次个数对应的辅助数字,遍历的时候查表即可。我所指的遍历的方式是通过查表,找到当前辅助数字代表的所有可能,然后按位与和按位或操作找到确定的0或1,如果已有确定的位置,要先剔除掉不符合该位置的数

一、脚本概述

本脚本是基于查表 + 位运算 + 复杂度控制的数织(Nonogram)解谜工具,核心目标是通过枚举有效排列、位运算求交集,严格标注 100% 确定的格子,避免错误并高效收敛。

二、核心设计思路

1. 技术路线

  • 查表预生成:预计算所有可能的二进制排列(2¹⁵=32768 种),通过字典实现 O (1) 快速查询;
  • 复杂度控制:仅处理低复杂度行 / 列,避免无意义计算;
  • 位运算求交集:通过逐次累积的按位与 / 或运算,快速找到所有有效排列的 “必 1 格” 和 “必 0 格”;
  • 迭代约束:按顺序遍历行 / 列,仅更新不确定格,确保结果无错误。

三、核心模块说明

1. 预生成查表字典模块(pregenPermDict函数)

功能

预计算 0~32767(2¹⁵-1)所有十进制数对应的 15 位二进制数组,存储到字典中,避免重复计算。

实现逻辑

matlab

function permDict = pregenPermDict(N) permDict = containers.Map('KeyType', 'uint32', 'ValueType', 'any'); for dec = 0:(2^N - 1) binStr = dec2bin(dec, N); % 十进制转N位二进制字符串 binArr = str2num(binStr')';% 字符串转1xN二进制数组 permDict(uint32(dec)) = binArr; end end
输入输出
  • 输入:N(网格尺寸,如 15);
  • 输出:permDict(字典,key = 十进制数,value = 对应的 1xN 二进制数组)。

2. 复杂度计算模块(calculateComplexity函数)

功能

量化行 / 列的解谜难度,仅处理复杂度≤阈值的行 / 列。

复杂度分层规则
层级判定条件复杂度值
0 级无不确定格0
1 级提示为 0(全 0)1
2 级单段提示 + 不确定数 - 提示值 ≤11
3 级单段提示 + 不确定数 - 提示值 ≤33
4 级单段提示 + 不确定数 - 提示值 ≤55
5 级多段提示6(超过阈值)
实现逻辑

matlab

function comp = calculateComplexity(line, hint, gridSize) uncertain_num = sum(line == 0.5); hint_seg_num = length(hint); hint_fill_num = sum(hint); if uncertain_num == 0; comp=0; return; end if hint_fill_num == 0; comp=1; return; end if hint_seg_num == 1 diff = uncertain_num - hint_fill_num; comp = diff<=1 ? 1 : (diff<=3 ? 3 : 5); return; end comp = 6; end

3. 行 / 列处理核心模块(processLineWithLookup函数)

功能

对单一行 / 列,通过查表筛选有效排列,再用位运算找必 1 / 必 0 格。

实现流程

关键代码(位运算修复)
% 必1格:逐次按位与(初始值=全1) andDec = uint32(2^gridSize - 1); for idx = 1:length(validPermDecs) andDec = bitand(andDec, uint32(validPermDecs(idx))); end must1Arr = permDict(andDec); % 必0格:逐次按位或(初始值=全0)→取反 orDec = uint32(0); for idx = 1:length(validPermDecs) orDec = bitor(orDec, uint32(validPermDecs(idx))); end must0Arr = 1 - permDict(orDec);

4. 迭代控制模块

功能

按顺序遍历行 / 列,实时计算复杂度,仅处理低复杂度行 / 列,无更新时终止。

核心逻辑
while bigIter < maxBigIter % 1. 按顺序处理所有行(复杂度≤阈值) % 2. 按顺序处理所有列(复杂度≤阈值) % 3. 无更新或所有行列复杂度超阈值→终止 end

四、使用说明

1. 前置条件

  • 需提前生成rowHints.matcolHints.mat文件,存储行 / 列的提示数字;
  • MATLAB 版本≥R2019b(支持containers.Map)。

2. 参数调整

  • complexityThreshold:复杂度阈值(默认 5,可调整为 10 以处理更复杂的行 / 列);
  • maxBigIter:最大大迭代次数(默认 50)。

3. 运行流程

  1. 加载提示数据;
  2. 预生成查表字典;
  3. 初始化网格;
  4. 大迭代处理行 / 列;
  5. 验证结果并可视化。

五、效果验证

以 15×15 数织为例(复杂度阈值 = 10):

  • 迭代次数:4 次大迭代后收敛;
  • 结果:所有确定格子均符合提示约束,无错误;
  • 效率:32768 次查表 + 位运算仅需毫秒级

六、后续优化方向

  1. 支持更大网格(如 20×20):优化查表字典的内存占用;
  2. 进阶规则:添加 X-Wing、剑鱼法等高级解谜规则,提升复杂行 / 列的处理能力;
  3. 可视化增强:区分 “必 1 格”“必 0 格”“不确定格” 的显示样式。

代码传送门

下载

实战效果

load('rowHints.mat'); load('colHints.mat'); %分别修改行,列的提示数字 save('rowHints.mat','rowHints'); save('colHints.mat','colHints');

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

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

相关文章

国家癌症中心综述论文引用“小济医生”:AI 乳腺超声筛查如何走向真实应用

近期&#xff0c;国家癌症中心/国家肿瘤临床医学研究中心、中国医学科学院肿瘤医院超声科王勇教授团队&#xff0c;在《中国医学影像技术》发表综述论文《人工智能用于超声诊断乳腺癌&#xff1a;现状、挑战与未来》。该文系统回顾了 AI 技术在乳腺超声诊断领域的发展现状&…

基于8051的Proteus与Keil联合调试入门指南

从零开始玩转8051&#xff1a;Proteus与Keil联合调试实战全记录你有没有过这样的经历&#xff1f;手头没有开发板&#xff0c;却急着想验证一段LED闪烁代码&#xff1b;接错了电路&#xff0c;烧了芯片还得重新采购&#xff1b;程序跑飞了&#xff0c;示波器抓不到时序&#xf…

手把手教你使用hal_uartex_receivetoidle_dma构建稳定工控链路

用好STM32的“空闲线检测DMA”&#xff0c;让工控通信稳如磐石在工业现场&#xff0c;串口通信是PLC、传感器、HMI之间最基础也是最关键的桥梁。但你有没有遇到过这样的问题&#xff1a;Modbus报文偶尔丢帧&#xff1f;高速数据下CPU跑满&#xff0c;系统卡顿&#xff1f;调试时…

Keil5创建工程基础教学:系统学习第一步

从零开始搭建嵌入式开发环境&#xff1a;Keil5工程创建实战指南你有没有遇到过这样的情况&#xff1f;手头拿到一块全新的STM32开发板&#xff0c;兴冲冲打开Keil&#xff0c;准备大干一场&#xff0c;结果点开“新建工程”却一脸懵——该选哪个芯片&#xff1f;启动文件要不要…

光照强度传感器采集优化:CubeMX配置ADC操作指南

用CubeMX玩转光照采集&#xff1a;从配置到优化的实战笔记最近在做一个农业物联网项目&#xff0c;需要对大棚内的光照强度进行长期监测。最开始我直接用轮询方式读ADC&#xff0c;结果发现数据跳得厉害&#xff0c;CPU还一直满载——这显然没法用于电池供电的终端节点。后来彻…

光照强度传感器采集优化:CubeMX配置ADC操作指南

用CubeMX玩转光照采集&#xff1a;从配置到优化的实战笔记最近在做一个农业物联网项目&#xff0c;需要对大棚内的光照强度进行长期监测。最开始我直接用轮询方式读ADC&#xff0c;结果发现数据跳得厉害&#xff0c;CPU还一直满载——这显然没法用于电池供电的终端节点。后来彻…

Keil添加文件实战:构建STM32最小系统项目应用

手动构建STM32最小系统&#xff1a;从零开始掌握Keil项目搭建核心技能 你有没有过这样的经历&#xff1f;明明代码写得没错&#xff0c;却在编译时爆出一堆“找不到头文件”或“未定义符号”的错误。点开Keil工程一看&#xff0c;文件明明就在目录里——可就是不工作。 问题出…

嵌入式系统前级验证:Multisim仿真信号完整性分析

用Multisim提前“预演”信号问题&#xff1a;嵌入式系统前级验证实战指南你有没有遇到过这样的场景&#xff1f;PCB板子刚回来&#xff0c;焊上芯片一通电&#xff0c;发现ADC读数跳得像心电图&#xff0c;SPI通信时不时丢包&#xff0c;MCU莫名其妙复位……查来查去&#xff0…

JSON配置文件在嵌入式端的解析实战案例

让配置“活”起来&#xff1a;一个嵌入式工程师的JSON实战手记最近在调试一款基于STM32的工业传感器节点时&#xff0c;客户提出了这样一个需求&#xff1a;“能不能不改固件就能切换工作模式&#xff1f;”——这听起来简单&#xff0c;但背后却牵动了整个系统的架构设计。我们…

双RJ45+RS485机柜温湿度传感器:免打孔磁吸安装,重塑机房监控新范式

引言&#xff1a;机房监控的痛点与技术革新数据中心与机房作为数字时代的核心基础设施&#xff0c;其环境稳定性直接决定设备寿命与业务连续性。根据国标 GB 50174-2017 规定&#xff0c;机房正常运行温度需控制在 18~27℃&#xff0c;相对湿度保持 40%~60% RH&#xff0c;温度…

JSON配置文件在嵌入式端的解析实战案例

让配置“活”起来&#xff1a;一个嵌入式工程师的JSON实战手记最近在调试一款基于STM32的工业传感器节点时&#xff0c;客户提出了这样一个需求&#xff1a;“能不能不改固件就能切换工作模式&#xff1f;”——这听起来简单&#xff0c;但背后却牵动了整个系统的架构设计。我们…

【毕业设计】SpringBoot+Vue+MySQL 汽车票网上预订系统平台源码+数据库+论文+部署文档

&#x1f4a1;实话实说&#xff1a;CSDN上做毕设辅导的都是专业技术服务&#xff0c;大家都要生活&#xff0c;这个很正常。我和其他人不同的是&#xff0c;我有自己的项目库存&#xff0c;不需要找别人拿货再加价。我就是个在校研究生&#xff0c;兼职赚点饭钱贴补生活费&…

重庆思庄技术分享——如何在Linux中使用nohup命令记录日志

如何在Linux中使用nohup命令记录日志 在 Linux 中&#xff0c;nohup 命令用于在不挂断终端会话的情况下运行程序。默认情况下&#xff0c;nohup 会将输出重定向到名为 nohup.out 的文件中。如果你想自定义日志文件的名称和位置&#xff0c;可以按照以下步骤操作&#xff1a; 1、…

STM32数字频率计设计的实际项目部署

用STM32打造高精度数字频率计&#xff1a;从原理到实战部署你有没有遇到过这样的场景&#xff1f;手头有个信号发生器&#xff0c;输出频率标称是1.5 MHz&#xff0c;但示波器一看——咦&#xff0c;怎么差了几十kHz&#xff1f;又或者在调试一个编码器时&#xff0c;转速显示忽…

IAR低功耗模式设置:适用于工控设备

如何用 IAR 实现工业设备的“休眠-唤醒”艺术&#xff1a;低功耗设计实战全解析在工业现场&#xff0c;你是否见过这样的场景&#xff1f;一台部署在偏远管道旁的无线监测终端&#xff0c;靠着一节锂亚电池默默工作了五年&#xff0c;风吹日晒、温差剧烈&#xff0c;却始终稳定…

Java SpringBoot+Vue3+MyBatis 民宿在线预定平台系统源码|前后端分离+MySQL数据库

&#x1f4a1;实话实说&#xff1a;CSDN上做毕设辅导的都是专业技术服务&#xff0c;大家都要生活&#xff0c;这个很正常。我和其他人不同的是&#xff0c;我有自己的项目库存&#xff0c;不需要找别人拿货再加价。我就是个在校研究生&#xff0c;兼职赚点饭钱贴补生活费&…

Proteus汉化与原版切换技巧:项目应用实例分享

Proteus汉化实战&#xff1a;如何优雅地在中英文界面间自由切换&#xff1f; 你有没有过这样的经历&#xff1f;—— 站在讲台上给学生演示Proteus仿真&#xff0c;刚打开软件&#xff0c;一个学生举手&#xff1a;“老师&#xff0c;‘Pick Device’是啥意思&#xff1f;” …

基于域名的动态数据源切换实现教程

概述这是一个基于Spring Boot的多数据源动态切换方案&#xff0c;通过解析请求的域名自动选择对应的数据源。核心组件实现1. 会话上下文管理 (SessionContext)使用 TransmittableThreadLocal 实现线程间数据传递提供统一的键值对存储接口在请求开始时清理旧数据&#xff0c;在结…

SPI控制器功能验证实践:基于iverilog的端到端流程

SPI控制器功能验证实践&#xff1a;从零构建基于Icarus Verilog的开源仿真流程 你有没有遇到过这样的场景&#xff1f;手头有个SPI控制器的RTL代码&#xff0c;想快速跑个仿真看看时序对不对&#xff0c;结果发现公司没有VCS许可证&#xff0c;ModelSim又太重启动慢&#xff0c…

零基础学习指南:STLink驱动安装全过程

手把手带你搞定 STLink 驱动安装&#xff1a;从识别失败到稳定调试的完整实战指南 你有没有遇到过这样的场景&#xff1f; 刚拿到一块崭新的 Nucleo 开发板&#xff0c;兴冲冲地插上电脑&#xff0c;打开 STM32CubeIDE&#xff0c;结果弹出一条令人崩溃的提示&#xff1a; “…