分别从 文章1 https://axial-sql.com/info/exploring-sql-server-solving-sudoku-with-t-sql/ 和文章2 https://www.sqlservercentral.com/blogs/tsql-sudoku-ii-2 看到的代码和解释,思路还是穷举法。然后经过删减,终于能执行出来了,注释掉了不懂要怎么修改的部分,需要进一步研究。
sql
WITH x( s, ind ) AS
(
SELECT CONVERT(VARCHAR(100),'53 7 6 195 98 6 8 6 34 8 3 17 2 6 6 28 419 5 8 79'),
CHARINDEX(' ', '53 7 6 195 98 6 8 6 34 8 3 17 2 6 6 28 419 5 8 79') AS ind
UNION ALL
SELECT CONVERT(VARCHAR(100), SUBSTRING(s, 1, ind - 1) + CONVERT(CHAR(1), z) + SUBSTRING(s, ind + 1, 81)),
CHARINDEX(' ', s, ind + 1) AS ind
FROM x
CROSS APPLY ( VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9)) z (z)
WHERE ind > 0
AND NOT EXISTS (
SELECT NULL
FROM ( VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9)) ww (lp)
WHERE z = SUBSTRING(s, (ind - 1) % 9 - 8 + lp * 9, 1)
OR z = SUBSTRING(s, ((ind - 1) / 9) * 9 + lp, 1)
OR z = SUBSTRING(s, (((ind - 1) / 3) % 3) * 3 + (((ind - 1) / 27) * 27) + lp + (((lp - 1) / 3) * 6), 1)
)
), Sud AS (
SELECT TOP 9 SUBSTRING(s, ROW_NUMBER() OVER (ORDER BY s) * 9 - 8, ROW_NUMBER() OVER (ORDER BY s) * 9 - (ROW_NUMBER() OVER (ORDER BY s) * 9 - 9)) AS ConcatRow
FROM x
CROSS APPLY ( VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9)) y(N)
WHERE ind = 0
)
, SudTable (RowCol,ConcatRow) as(
Select Row_Number() Over (Order by (Select 1)),CONVERT(VARCHAR(10), ConcatRow)
From Sud
)
select * from SudTable;
/*
SELECT c1.RowCol , [1], [2], [3], [4], [5], [6], [7], [8], [9]
FROM (
SELECT S.RowCol, ROW_NUMBER() OVER (PARTITION BY RowCol ORDER BY ConcatRow) as ColNo , SUBSTRING(ConcatRow, ROW_NUMBER() OVER (PARTITION BY S.RowCol ORDER BY ConcatRow), 1) as Data
FROM SudTable S
CROSS APPLY ( VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9)) x(N)
) Intr
PIVOT (
MAX(Data)
FOR ColNo IN ([1], [2], [3], [4], [5], [6], [7], [8], [9])
) AS C1
WHERE c1.RowCol = S.RowCol
ORDER BY S.RowCol ASC
*/
;
go
输出结果
mssql@52f277ddc992:/$ /opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -No -i /par/tsqlsudoku.txt -P Pass_123
RowCol ConcatRow
-------------------- ----------
1 534678912
2 672195348
3 198342567
4 859761423
5 426853791
6 713924856
7 961537284
8 287419635
9 345286179
(9 rows affected)