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;
相关推荐
希和202729 分钟前
C语言程序设计题|有序数组插入数字冒泡排序
c语言·数据结构·算法
Pniubi1 小时前
力扣73 矩阵置零
算法·leetcode·矩阵
Decay__1 小时前
SQL Server 数据库全栈运维实战系列 — 合集索引(24 篇)
运维·数据库·sql·mysql·架构
Thanks_ks1 小时前
SQL 的 GROUP BY 与聚合函数:从会写 SELECT 到会做统计
数据库·sql·mysql·group by·数据统计·聚合函数·having
Decay__9 小时前
12_MySQL InnoDB 内存与锁调优 —— Buffer Pool、redo log、隔离级别与锁等待
运维·数据库·sql·mysql·架构
笃行35010 小时前
AI数据库的库内四层结构,KingbaseES 产品拆解
数据库
布莱克60511 小时前
C++ 中 map 的 insert 与 emplace:key 已存在时会覆盖吗?
开发语言·数据结构·c++·算法·map
我是大猴子11 小时前
redis
数据库·redis·缓存
苏宸啊13 小时前
MySQL(一)
数据库·mysql