news 2026/4/18 14:20:28

利用豆包辅助编写数独隐式唯一数填充c程序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
利用豆包辅助编写数独隐式唯一数填充c程序

在查看程宁先生的SQL中间过程时,发现他一轮迭代填充的唯一数要比我自己的程序多很多,以下面数据为例

id | iteration | puzzle | result ------+-----------+-----------+----------- 1001 | 0 | .......1.+| 000000010+ | | 4........+| 400000000+ | | .2.......+| 020000000+ | | ....5.4.7+| 000050407+ | | ..8...3..+| 008000300+ | | ..1.9....+| 001090000+ | | 3..4..2..+| 300400200+ | | .5.1.....+| 050100000+ | | ...8.6... | 000806000 1001 | 1 | .......1.+| 000000010+ | | 4........+| 400000000+ | | .2.......+| 020000000+ | | ....5.4.7+| 000051407+ <--- | | ..8...3..+| 008000301+ <--- | | ..1.9....+| 001090000+ | | 3..4..2..+| 300475200+ <--- | | .5.1.....+| 050100000+ | | ...8.6... | 000806100 <---

填充了5个唯一数,而我的唯一数程序只找到1个。
请教程宁先生,他说他让AI实现了显式和隐式唯一数,我查了资料。看了隐性唯一数的定义,终于明白了,某数某宫group by后count(*)=1就是此数在此宫候选数出现了一次
。行、列隐式唯一数同理。我的唯一数程序只实现了显式的。
明白了原理,就让豆包辅助编写程序

还有一种“隐性唯一数” (Hidden Single) 是指一个单元格里有多个候选数(例如:{1, 7, 8}),但其中一个候选数(例如 ‘1’)在该宫的其他任何笔记中都没有出现。比如在这个宫里,我们可以看到以下已填入的数字和笔记:
已填数字: 5 (R1C7), 6 (R2C7), 2 (R2C8)。
笔记 (候选数):R1C8 = {3, 4, 9}R1C9 = {3, 4, 9}R2C9 = {3, 4, 7, 8}R3C7 = {1, 7, 8} (我们需要关注的单元格)R3C8 = {7, 8, 9}R3C9 = {7, 8, 9}
第一步:扫描笔记寻找特定数字
与其盯着单个单元格看,不如扫描整个宫来寻找特定的数字。让我们来寻找数字 1。
R1C8?没有 ‘1’。
R1C9?没有 ‘1’。
R2C9?没有 ‘1’。
R3C7?是的,它有一个 ‘1’。
R3C8?没有 ‘1’。
R3C9?没有 ‘1’。
第二步:找到解
数字 1 作为候选数,在整个 3x3 宫中仅出现在一个单元格中:单元格 R3C7。
尽管 R3C7 也包含了 7 和 8 的笔记,但它是这个宫里数字 1 唯一可能的容身之处。因此,R3C7 必须是 1。实现这种算法的函数,不做别的。
它输出如下代码

// 检查并填充宫(Box)中的隐性唯一数intfill_hidden_single_in_boxes(){intfilled_count=0;// 遍历所有9个3x3宫for(intbox_row=0;box_row<SIZE;box_row+=3){for(intbox_col=0;box_col<SIZE;box_col+=3){// 对每个数字1-9检查是否是该宫的隐性唯一数for(intnum=1;num<=SIZE;num++){intfound_row=-1;intfound_col=-1;intcount=0;// 遍历当前宫的所有格子for(intr=box_row;r<box_row+3;r++){for(intc=box_col;c<box_col+3;c++){// 跳过已填充的格子if(sudoku[r][c].value!=0){continue;}// 计算当前格子的候选数掩码uint16_tmask=get_candidate_mask(r,c);// 检查该数字是否是当前格子的候选数if(mask&(1<<(num-1))){found_row=r;found_col=c;count++;// 超过1个格子有该候选数,无需继续检查if(count>1){break;}}}if(count>1){break;}}// 该数字在当前宫中仅出现在一个空位的候选数中(隐性唯一)if(count==1){sudoku[found_row][found_col].value=num;sudoku[found_row][found_col].candidates=0;filled_count++;// 填充后立即更新,避免重复处理printf("填充宫隐性唯一数: 位置(%d,%d) = %d\n",found_row+1,found_col+1,num);}}}}returnfilled_count;}// 检查并填充行中的隐性唯一数intfill_hidden_single_in_rows(){intfilled_count=0;// 遍历所有9行for(introw=0;row<SIZE;row++){// 对每个数字1-9检查是否是该行的隐性唯一数for(intnum=1;num<=SIZE;num++){intfound_col=-1;intcount=0;// 遍历当前行的所有格子for(intcol=0;col<SIZE;col++){// 跳过已填充的格子if(sudoku[row][col].value!=0){continue;}// 计算当前格子的候选数掩码uint16_tmask=get_candidate_mask(row,col);// 检查该数字是否是当前格子的候选数if(mask&(1<<(num-1))){found_col=col;count++;// 超过1个格子有该候选数,无需继续检查if(count>1){break;}}}// 该数字在当前行中仅出现在一个空位的候选数中(隐性唯一)if(count==1){sudoku[row][found_col].value=num;sudoku[row][found_col].candidates=0;filled_count++;printf("填充行隐性唯一数: 位置(%d,%d) = %d\n",row+1,found_col+1,num);}}}returnfilled_count;}// 检查并填充列中的隐性唯一数intfill_hidden_single_in_cols(){intfilled_count=0;// 遍历所有9列for(intcol=0;col<SIZE;col++){// 对每个数字1-9检查是否是该列的隐性唯一数for(intnum=1;num<=SIZE;num++){intfound_row=-1;intcount=0;// 遍历当前列的所有格子for(introw=0;row<SIZE;row++){// 跳过已填充的格子if(sudoku[row][col].value!=0){continue;}// 计算当前格子的候选数掩码uint16_tmask=get_candidate_mask(row,col);// 检查该数字是否是当前格子的候选数if(mask&(1<<(num-1))){found_row=row;count++;// 超过1个格子有该候选数,无需继续检查if(count>1){break;}}}// 该数字在当前列中仅出现在一个空位的候选数中(隐性唯一)if(count==1){sudoku[found_row][col].value=num;sudoku[found_row][col].candidates=0;filled_count++;printf("填充列隐性唯一数: 位置(%d,%d) = %d\n",found_row+1,col+1,num);}}}returnfilled_count;}// 综合填充所有隐性唯一数(宫+行+列),迭代直到无新填充intfill_hidden_singles(){inttotal_filled=0;inthas_change;// 循环直到一轮遍历中没有填充任何隐性唯一数do{has_change=0;intfilled_box=fill_hidden_single_in_boxes();intfilled_row=fill_hidden_single_in_rows();intfilled_col=fill_hidden_single_in_cols();intcurrent_filled=filled_box+filled_row+filled_col;if(current_filled>0){has_change=1;total_filled+=current_filled;}}while(has_change);returntotal_filled;}

并告知了调用位置。
集成到原有流程
在原有fill_unique_candidates之后调用该函数,形成完整的预处理流程:

// 第一步:填充唯一候选数(显性唯一)fill_unique_candidates();// 第二步:填充隐性唯一数fill_hidden_singles();// 第三步:DFS求解剩余部分if(!is_sudoku_complete()){solve_sudoku_dfs();}

合并后的代码编译执行

gcc cand.c -o cand -O3 root@66d4e20ec1d7:/par/1224/0112# ./cand 000000003001005600090040070000009050700000008050402000080020090003500100600000000 填充宫隐性唯一数: 位置(5,5) = 5 000000003001005600090040070000009050700050008050402000080020090003500100600000000,59 000000010400000000020000000000050407008000300001090000300400200050100000000806000 填充宫隐性唯一数: 位置(5,9) = 1 填充宫隐性唯一数: 位置(7,6) = 5 填充宫隐性唯一数: 位置(8,6) = 9 填充宫隐性唯一数: 位置(9,7) = 1 填充行隐性唯一数: 位置(4,6) = 1 ... 填充列隐性唯一数: 位置(1,3) = 3 693784512487512936125963874932651487568247391741398625319475268856129743274836159,0 总计处理数独数量:2 完全解决的数独数量:1

17个已知数的难题有很多可以只用两种唯一数解决。

time ./cand < sudoku17.txt >17out.txt 总计处理数独数量:49151 完全解决的数独数量:17376 real 0m6.511s user 0m6.468s sys 0m0.032s

从解决问题的数量时间来说,已经超过了MRV+DFS的效率。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 8:03:33

duckdb数据库CROSS JOIN LATERAL 中使用 EXISTS子查询的一个bug

以下代码片段改编自能够在PostgreSQL中正常执行的SQL。只把pi部分的/改写成了//。 WITH RECURSIVE d(d) AS MATERIALIZED(SELECT d from generate_series(1, 9)t(d)), pi(pos, r, c, bx) AS MATERIALIZED(SELECT pos,((pos - 1) // 9) 1 AS r,((pos - 1) % 9) 1 AS c,((pos -…

作者头像 李华
网站建设 2026/4/18 7:57:52

Windows系统完美使用苹果苹方字体:完整免费解决方案

Windows系统完美使用苹果苹方字体&#xff1a;完整免费解决方案 【免费下载链接】PingFangSC PingFangSC字体包文件、苹果平方字体文件&#xff0c;包含ttf和woff2格式 项目地址: https://gitcode.com/gh_mirrors/pi/PingFangSC 还在为Windows电脑无法显示苹果字体的优雅…

作者头像 李华
网站建设 2026/4/18 8:30:06

腾讯混元HY-MT1.5-1.8B:藏维蒙等民族语言翻译教程

腾讯混元HY-MT1.5-1.8B&#xff1a;藏维蒙等民族语言翻译教程 1. 引言&#xff1a;轻量级多语翻译模型的突破 随着全球化与本地化需求的不断增长&#xff0c;高质量、低延迟的神经机器翻译&#xff08;NMT&#xff09;已成为跨语言交流的核心基础设施。尤其在少数民族语言支持…

作者头像 李华
网站建设 2026/4/18 1:59:58

OpenCode社区生态:5万星项目的成功秘诀

OpenCode社区生态&#xff1a;5万星项目的成功秘诀 1. 引言 在AI编程助手快速发展的背景下&#xff0c;开发者对工具的灵活性、隐私保护和可扩展性提出了更高要求。OpenCode正是在这一趋势中脱颖而出的开源项目。作为一个2024年发布的AI编程框架&#xff0c;OpenCode以“终端…

作者头像 李华
网站建设 2026/4/17 23:57:35

AutoGen Studio避坑指南:vLLM部署Qwen3-4B常见问题解决

AutoGen Studio避坑指南&#xff1a;vLLM部署Qwen3-4B常见问题解决 1. 引言 1.1 业务场景描述 随着多智能体系统&#xff08;Multi-Agent System&#xff09;在复杂任务自动化中的广泛应用&#xff0c;AutoGen Studio作为微软推出的低代码AI智能体开发平台&#xff0c;正成为…

作者头像 李华
网站建设 2026/4/18 2:08:01

IndexTTS-2-LLM应用教程:公共场所语音播报系统

IndexTTS-2-LLM应用教程&#xff1a;公共场所语音播报系统 1. 章节概述 随着智能语音技术的快速发展&#xff0c;高质量、低延迟的文本转语音&#xff08;Text-to-Speech, TTS&#xff09;系统在公共服务、交通调度、医疗导引等场景中展现出巨大潜力。传统的TTS方案往往依赖GPU…

作者头像 李华