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 小时前
枚举类 enum class:强类型枚举的优势
linux·开发语言·c++·学习·算法·知识
VX:Fegn08956 小时前
计算机毕业设计|基于ssm + vue超市管理系统(源码+数据库+文档)
前端·数据库·vue.js·spring boot·后端·课程设计
chipsense6 小时前
电流传感器型号从数据库查询并排序输出到网页的方法
数据库·php·传感器·霍尔电流传感器
踢足球09296 小时前
寒假打卡:2026-01-28
数据库·oracle
麦聪聊数据6 小时前
智慧医疗数据互联互通:使用 QuickAPI 构建实时诊疗数据交换层
数据库·sql·安全
嘴贱欠吻!6 小时前
Flutter鸿蒙开发指南(七):轮播图搜索框和导航栏
算法·flutter·图搜索算法
风吹落叶花飘荡6 小时前
2026年mysql数据库迁移(全流程)
数据库·mysql
2301_822382767 小时前
Python上下文管理器(with语句)的原理与实践
jvm·数据库·python
m0_748229997 小时前
Laravel8.X核心功能全解析
开发语言·数据库·php
张祥6422889047 小时前
误差理论与测量平差基础笔记十
笔记·算法·机器学习