DeepSeek辅助编写的利用唯一可选数求解数独SQL

前面用python实现了逻辑,

把迭代填充唯一可选数逻辑改写成一句postgresql格式SQL,输入表sudoku包括id,puzzle,输出包括id,puzzle,result,unkown列,如果已解决,unkown列为0,否则为剩余0的个数

sql 复制代码
WITH RECURSIVE sudoku_solver AS (
    SELECT 
        id,
        puzzle,
        puzzle as current_state,
        0 as iteration
    FROM sudoku
    
    UNION ALL
    
    SELECT 
        s.id,
        s.puzzle,
        new_state,
        s.iteration + 1
    FROM sudoku_solver s
    CROSS JOIN LATERAL (
        -- 计算当前状态的候选数和唯一候选数
        WITH current_chars AS (
            SELECT generate_series(1, 81) as pos, 
                   substr(s.current_state, generate_series(1, 81), 1) as ch
        ),
        candidates AS (
            SELECT 
                cc.pos,
                array_agg(n.n ORDER BY n.n) as cand_array
            FROM current_chars cc
            CROSS JOIN generate_series(1, 9) n(n)
            WHERE cc.ch = '0'
            AND NOT EXISTS (
                SELECT 1
                FROM current_chars cc2
                WHERE ((cc.pos-1)/9) = ((cc2.pos-1)/9)
                  AND cc2.ch = n.n::text
                UNION ALL
                SELECT 1
                FROM current_chars cc2
                WHERE ((cc.pos-1)%9) = ((cc2.pos-1)%9)
                  AND cc2.ch = n.n::text
                UNION ALL
                SELECT 1
                FROM current_chars cc2
                WHERE 
                    ((cc.pos-1)/27) = ((cc2.pos-1)/27)
                    AND (((cc.pos-1)%9)/3) = (((cc2.pos-1)%9)/3)
                    AND cc2.ch = n.n::text
            )
            GROUP BY cc.pos
        ),
        unique_candidates AS (
            SELECT pos, cand_array[1] as val
            FROM candidates
            WHERE array_length(cand_array, 1) = 1
        )
        SELECT 
            string_agg(
                CASE 
                    WHEN uc.pos IS NOT NULL THEN uc.val::text
                    ELSE substr(s.current_state, p.pos, 1)
                END, 
                '' ORDER BY p.pos
            ) as new_state,
            COUNT(uc.pos) > 0 as has_unique  -- 检查本轮是否有唯一候选数
        FROM generate_series(1, 81) p(pos)
        LEFT JOIN unique_candidates uc ON uc.pos = p.pos
    ) calc
    WHERE 
        s.current_state LIKE '%0%'
        AND s.iteration < 10
        AND calc.has_unique  -- 只有本轮有唯一候选数才继续
        AND calc.new_state != s.current_state  -- 确保有变化
)
SELECT 
    id,
    puzzle,
    current_state as result,
    length(regexp_replace(current_state, '[^0]', '', 'g')) as unknown,
    iteration
FROM (
    SELECT 
        id,
        puzzle,
        current_state,
        iteration,
        row_number() OVER (PARTITION BY id ORDER BY iteration DESC) as rn
    FROM sudoku_solver
) ranked
WHERE rn = 1
ORDER BY id;
相关推荐
翻斗包菜1 分钟前
第 03 章 Python 操作 MySQL 数据库实战全解
数据库·python·mysql
旖-旎4 分钟前
哈希表(存在重复元素||)(4)
数据结构·c++·算法·leetcode·哈希算法·散列表
SPC的存折5 分钟前
1、MySQL故障排查与运维案例
linux·运维·服务器·数据库·mysql
Run_Teenage6 分钟前
Linux:认识信号,理解信号的产生和处理
linux·运维·算法
小臭希8 分钟前
Redis(NoSQL数据库,Linux-Ubuntu环境下)
数据库·redis·缓存
cdcdhj9 分钟前
在window下将Mongodb单机改为副本集,只用于测试环境,实际上并没有增加真的副本集
数据库·mongodb
xcjbqd014 分钟前
如何修改Oracle服务器默认的日期格式_NLS_DATE_FORMAT全局配置
jvm·数据库·python
HealthScience14 分钟前
SpliceVarDB数据集说明
数据库·oracle
倔强的石头_20 分钟前
表空间自动目录创建与存储管理实践:参数化配置与性能优化
数据库
無限進步D22 分钟前
蓝桥杯赛前刷题
c++·算法·蓝桥杯·竞赛