news 2026/5/6 15:24:29

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/5/3 16:09:37

CRNN OCR在房地产的应用:合同关键信息提取系统

CRNN OCR在房地产的应用&#xff1a;合同关键信息提取系统 &#x1f4c4; 背景与挑战&#xff1a;传统OCR难以应对复杂合同场景 在房地产行业中&#xff0c;每日需处理大量纸质或扫描版的房屋买卖合同、租赁协议、产权证明等文件。这些文档通常包含手写批注、模糊打印、复杂背景…

作者头像 李华
网站建设 2026/5/5 6:25:21

comfyui界面定制:打造专属Image-to-Video前端

comfyui界面定制&#xff1a;打造专属Image-to-Video前端 背景与目标&#xff1a;从通用工具到专业级定制化前端 在AIGC&#xff08;人工智能生成内容&#xff09;快速发展的今天&#xff0c;图像转视频&#xff08;Image-to-Video, I2V&#xff09; 技术正逐步成为创意生产链中…

作者头像 李华
网站建设 2026/4/26 16:25:48

AI语音版权归属:合成内容的知识产权界定难题

AI语音版权归属&#xff1a;合成内容的知识产权界定难题 &#x1f4cc; 引言&#xff1a;当AI“开口说话”&#xff0c;谁拥有这声音&#xff1f; 随着深度学习与语音合成技术的飞速发展&#xff0c;AI已经能够以极高的自然度生成带有情感色彩的中文语音。像 Sambert-Hifigan 这…

作者头像 李华
网站建设 2026/5/3 14:47:01

Sambert-HifiGan多情感语音合成:心理学因素分析

Sambert-HifiGan多情感语音合成&#xff1a;心理学因素分析 引言&#xff1a;当语音合成遇见情感表达 随着人工智能在自然语言处理和语音生成领域的飞速发展&#xff0c;语音合成&#xff08;Text-to-Speech, TTS&#xff09; 已从早期机械、单调的“机器人音”逐步迈向拟人化、…

作者头像 李华
网站建设 2026/5/3 2:23:21

用CRNN OCR做古籍数字化:传统文献的智能识别方案

用CRNN OCR做古籍数字化&#xff1a;传统文献的智能识别方案 OCR 文字识别&#xff1a;从现代文档到古籍修复的技术跃迁 在人工智能与文化遗产保护交汇的前沿&#xff0c;OCR&#xff08;光学字符识别&#xff09;技术正成为连接过去与未来的桥梁。传统的纸质文献、手稿、碑刻乃…

作者头像 李华