news 2026/4/23 15:41:49

DeepSeek辅助编写添加了矛盾检测的数独求解SQL

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeepSeek辅助编写添加了矛盾检测的数独求解SQL

在每次填充数字后,立即检查是否有位置候选数为空(无解状态)。

WITHRECURSIVE initialAS(SELECTid,puzzle board,-- 初始化行掩码:确保 SUM 结果被强制转为 int(SELECTarray_agg(m)FROM(--用2个元素分别保存前5个低位和后4个高位SELECTSUM(casewhenval>0then1::bigint<<(casewhenr<=4thenrelser-5end*9+val-1)else0end)::bigintasmFROMgenerate_series(0,8)rINNERJOINLATERAL(SELECTsubstring(puzzle,r*9+i,1)aschFROMgenerate_series(1,9)i)sONch<>'.'CROSSJOINLATERAL(SELECT(ch::text)::intasval)vGROUPBYcasewhenr<=4then1else2endORDERBYcasewhenr<=4then1else2end)s)asrows1,-- 初始化列掩码(SELECTarray_agg(m)FROM(SELECTSUM(casewhenval>0then1<<(val-1)else0end)::intasmFROMgenerate_series(1,9)cINNERJOINLATERAL(SELECTsubstring(puzzle,(i-1)*9+c,1)aschFROMgenerate_series(1,9)i)sONch<>'.'CROSSJOINLATERAL(SELECT(ch::text)::intasval)vGROUPBYcORDERBYc)s)ascols,-- 初始化宫掩码(SELECTarray_agg(m)FROM(SELECTSUM(casewhenval>0then1<<(val-1)else0end)::intasmFROMgenerate_series(0,8)bINNERJOINLATERAL(SELECTsubstring(puzzle,(b/3)*27+(b%3)*3+((i-1)/3)*9+((i-1)%3)+1,1)aschFROMgenerate_series(1,9)i)sONch<>'.'CROSSJOINLATERAL(SELECT(ch::text)::intasval)vGROUPBYbORDERBYb)s)asboxes,(SELECTarray_agg(pos::int)FROMgenerate_series(1,81)p(pos)WHEREsubstring(puzzle,p.pos,1)='0')aspositions,length(replace(replace(puzzle,'0',''),chr(10),''))knownFROM(selectid,replace(replace(puzzle,'?','0'),chr(10),'')puzzlefromsudoku9_9wherelength(replace(replace(puzzle,'?',''),chr(10),''))<30)sudoku9_9),solveAS(SELECTid,board::textboard,rows1,cols,boxes,falseassolved,positions,knownFROMinitialUNIONALL(WITHcurrent_levelAS(SELECT*FROMsolveWHERENOTsolved),all_candidatesAS(SELECTid,cl.board,cl.rows1,cl.cols,cl.boxes,pos,positions,known,-- 修正重点:每一个数组提取都加 ::int,并且用括号包裹位运算((((cl.rows1[(pos-1)/45+1]>>9*((pos-1)/9%5)&511)::int|cl.cols[(pos-1)%9+1]::int|cl.boxes[((pos-1)/27*3+(pos-1)%9/3)+1]::int)# 511 ) & 511 )::int as available_maskFROM(select*,unnest(positions)posfromcurrent_level)cl),best_posAS(SELECTDISTINCTON(board)*,-- 计算 1 的数量length(replace((available_mask::bit(9))::text,'0',''))asc_countFROMall_candidatesORDERBYboard,c_count,bit_count(boxes[((pos-1)/27*3+(pos-1)%9/3)+1]::int::bit(9))/* case when known>=40 then pos else -greatest(length(replace(substr(board,1,pos),'0',''))*100/pos, length(replace(substr(board,pos+1),'0',''))*100/(81-pos+1)) end */),next_stepAS(SELECTid,substring(bp.board,1,bp.pos-1)||n.val||substring(bp.board,bp.pos+1)asnext_board,casewhenpos<=45thenarray[bp.rows1[1]|(1::bigint<<(n.val-1+(pos-1)/9%5*9)),bp.rows1[2]]elsearray[bp.rows1[1],bp.rows1[2]|(1::bigint<<(n.val-1+(pos-1)/9%5*9))]endasnext_rows,bp.cols[:c_idx-1]||((bp.cols[c_idx]::int|(1<<(n.val-1)))::int)::int||bp.cols[c_idx+1:]asnext_cols,bp.boxes[:b_idx-1]||((bp.boxes[b_idx]::int|(1<<(n.val-1)))::int)::int||bp.boxes[b_idx+1:]asnext_boxes,array_remove(positions,pos)asrem_pos,known,bp.pos,n.valasfilled_valFROMbest_pos bpCROSSJOINLATERAL(selectvalfromgenerate_series(1,9)n(val)WHEREget_bit(bp.available_mask::int::bit(9),9-n.val)=1)nCROSSJOINLATERAL(SELECT((pos-1)/9)+1asr_idx,((pos-1)%9)+1asc_idx,((pos-1)/27*3+(pos-1)%9/3)+1asb_idx)idx),-- 矛盾检测:检查填充后是否有位置候选数为空conflict_checkAS(SELECTns.id,ns.next_board,ns.next_rows,ns.next_cols,ns.next_boxes,ns.rem_pos,ns.known,-- 检查是否有位置候选数为空(矛盾状态)EXISTS(SELECT1FROMunnest(ns.rem_pos)asp(pos)CROSSJOINLATERAL(SELECT(((ns.next_rows[(pos-1)/45+1]>>9*((pos-1)/9%5)&511)::int|ns.next_cols[(pos-1)%9+1]::int|ns.next_boxes[((pos-1)/27*3+(pos-1)%9/3)+1]::int)# 511)&511asavailable_mask)maskWHEREmask.available_mask=0-- 候选数为空,矛盾!)/*false*/ashas_conflictFROMnext_step ns)SELECTid,next_board,next_rows,next_cols,next_boxes,(position('0'INnext_board)=0)AND(NOThas_conflict)assolved,-- 已解决且无矛盾rem_pos,known+1asknownFROMconflict_checkWHERENOThas_conflict-- 过滤掉有矛盾的状态))SELECTi.id,regexp_replace(i.board,'(.{9})','\1'||chr(10),'g')ASpuzzle,regexp_replace(v.board,'(.{9})','\1'||chr(10),'g')ASresultFROMinitial iLEFTJOIN(SELECTid,boardFROM(SELECTid,board,row_number()OVER(PARTITIONBYidORDERBYknownDESC)asrnFROMsolveWHEREsolved)v0WHERErn=1)vONi.id=v.id;

实测表明,提前过滤代价还是比下轮测试大,因为要算这么多候选数,而下轮实际候选数只选best_pos,过滤的比例大约在10%,不算太多,除非有更好的实现,不然没有必要。

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

新手必问:Image-to-Video到底适不适合我?

新手必问&#xff1a;Image-to-Video到底适不适合我&#xff1f;Image-to-Video图像转视频生成器 二次构建开发by科哥你是否曾幻想过&#xff0c;把一张静态照片变成一段生动的动态视频&#xff1f;比如让照片中的人走动起来、让静止的海浪开始翻滚、让一朵花在镜头前缓缓绽放&…

作者头像 李华
网站建设 2026/4/22 19:19:39

我们每个人看到的世界是一样的吗?

每个人观测观测者的结论都不一样&#xff0c;为什么&#xff1f;道AI&#x1f30c; 量子观测悖论的太极全息解构——观测者宇宙的持久化生成模型---&#x1f52c; 第一层&#xff1a;经典观测陷阱的量子持久化诊断传统认知将“观测差异”归因于&#xff1a;1. 主观偏见&#xf…

作者头像 李华
网站建设 2026/4/23 8:33:34

解析常见工业环境导致JLink驱动安装失败的技术盲点

工业现场J-Link连不上&#xff1f;这5个“隐形杀手”你可能从未排查过 在嵌入式开发的日常中&#xff0c;J-Link几乎是每个工程师的“老伙计”。它稳定、高效、支持芯片广&#xff0c;堪称调试界的“万能钥匙”。但当你信心满满地把探针插进工控机USB口&#xff0c;结果却换来…

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

高抗干扰环境下波特率自适应调整技术

高抗干扰环境下&#xff0c;如何让UART通信“自己会调速”&#xff1f;你有没有遇到过这样的场景&#xff1a;设备在实验室里跑得好好的&#xff0c;一拿到现场就频繁丢包、数据错乱&#xff1f;电机一启动&#xff0c;串口通信直接“罢工”。排查半天发现&#xff0c;不是协议…

作者头像 李华
网站建设 2026/4/23 9:52:59

CRNN OCR实战:如何识别模糊文档中的文字?

CRNN OCR实战&#xff1a;如何识别模糊文档中的文字&#xff1f; &#x1f4d6; 项目简介 在数字化转型加速的今天&#xff0c;OCR&#xff08;光学字符识别&#xff09;技术已成为信息提取的核心工具。无论是扫描文档、发票识别&#xff0c;还是街景路牌解析&#xff0c;OCR 都…

作者头像 李华
网站建设 2026/4/23 13:20:07

语音合成部署太复杂?免配置镜像让效率提升5倍

语音合成部署太复杂&#xff1f;免配置镜像让效率提升5倍 &#x1f3af; 为什么语音合成落地如此困难&#xff1f; 在智能客服、有声阅读、虚拟主播等场景中&#xff0c;高质量的中文语音合成&#xff08;TTS&#xff09;已成为不可或缺的技术能力。然而&#xff0c;尽管 Mod…

作者头像 李华