news 2026/4/3 4:50:07

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/2 17:49:02

医疗语音助手搭建:基于Sambert的病历播报系统安全合规实践

医疗语音助手搭建&#xff1a;基于Sambert的病历播报系统安全合规实践 &#x1f3e5; 项目背景与医疗场景需求 在智慧医疗快速发展的背景下&#xff0c;临床医生每天需处理大量电子病历、检查报告和护理记录。长时间阅读屏幕文本不仅效率低下&#xff0c;还容易造成视觉疲劳。尤…

作者头像 李华
网站建设 2026/4/3 0:11:26

低代码+AI:图像转视频工具平民化趋势

低代码AI&#xff1a;图像转视频工具平民化趋势 引言&#xff1a;从专业制作到人人可创的内容革命 在传统影视与动画制作领域&#xff0c;将静态图像转化为动态视频一直是高门槛的技术活。它依赖专业的3D建模、关键帧动画和复杂的后期处理流程&#xff0c;通常需要团队协作和昂…

作者头像 李华
网站建设 2026/3/30 19:37:36

部署完却不会用?Image-to-Video高级功能全揭秘

部署完却不会用&#xff1f;Image-to-Video高级功能全揭秘 &#x1f4d6; 引言&#xff1a;从部署到高效使用的最后一公里 许多开发者在成功部署 Image-to-Video 图像转视频生成器 后&#xff0c;常常面临一个尴尬的问题&#xff1a;“部署完成了&#xff0c;但不知道怎么用出…

作者头像 李华
网站建设 2026/4/2 7:38:51

收藏学习!2026年Agent工程化元年:从Demo到可靠AI系统的完整指南

Agent工程化是2026年的重要趋势&#xff0c;构建可靠Agent系统面临五大工程挑战。文章提出四层架构模型&#xff08;应用交互层、智能决策层、知识上下文层、运行时与信任层&#xff09;和十大核心工程维度&#xff0c;帮助开发者将不确定的LLM驯化为可靠系统。预测到2027年&am…

作者头像 李华
网站建设 2026/3/24 15:41:02

导师推荐!自考必备TOP9 AI论文工具深度测评

导师推荐&#xff01;自考必备TOP9 AI论文工具深度测评 2026年自考论文写作工具测评&#xff1a;为何需要一份权威榜单&#xff1f; 随着人工智能技术的不断发展&#xff0c;越来越多的自考学生开始借助AI工具提升论文写作效率。然而&#xff0c;市面上的论文辅助工具种类繁多&…

作者头像 李华