/*
在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法
*/
--建表
CREATE TABLE #queen
(
id INT ,
val INT
)
CREATE TABLE #rst
(
id INT IDENTITY(1,1),
rst VARCHAR(100)
)
INSERT INTO #queen (id,val)
SELECT number-1,0 FROM master..spt_values WHERE type='P' and number>0 AND number<=8
GO
--更新数据
CREATE PROCEDURE sp_savequee(@row int,@flag bit)
AS
BEGIN
IF @flag=1
UPDATE #queen SET val=1 WHERE id =@row
ELSE
UPDATE #queen SET val=val+1 WHERE id =@row
END
GO
--获取数据
CREATE PROCEDURE sp_getquee(@row INT,@rst INT OUTPUT)
AS
BEGIN
DECLARE @sql NVARCHAR(1000)
SELECT @rst=val from #queen WHERE id=@row
END
GO
--判断数据
CREATE PROCEDURE sp_CheckQueens(@row INT,@check BIT OUTPUT)
AS
BEGIN
DECLARE @i INT =0
DECLARE @rst1 INT
DECLARE @rst2 INT
WHILE @i<@row
BEGIN
EXEC sp_getquee @i,@rst1 OUTPUT
EXEC sp_getquee @row,@rst2 OUTPUT
IF (ABS(@rst1-@rst2) =ABS( @i-@row) OR @rst1=@rst2)
BEGIN
SET @check='false'
RETURN
end
SET @i=@i+1
END
SET @check='true'
RETURN
END
GO
--递归调用
CREATE PROCEDURE sp_PutQueen(@n int, @row int )
AS
BEGIN
SET NOCOUNT ON
DECLARE @queen INT
DECLARE @check BIT
DECLARE @str VARCHAR(100)
EXEC sp_savequee @row,1
EXEC sp_getquee @row,@queen OUTPUT
while @queen<=@n
BEGIN
IF @check='true'
BEGIN
SET @row=@row+1
IF @row<@n
EXEC sp_PutQueen @n, @row
ELSE
BEGIN
SET @str=(SELECT ''+CONVERT(VARCHAR(10),val-1) FROM #queen ORDER BY id
FOR XML PATH(''))
INSERT INTO #rst(rst) VALUES(@str)
END
SET @row=@row-1
END
EXEC sp_getquee @row,@queen OUTPUT
EXEC sp_savequee @row,0
exec sp_CheckQueens @row,@check OUTPUT
END
END
GO
--得到结果
EXEC sp_PutQueen 8,0
SELECT * FROM #rst
--删除对象
IF OBJECT_ID('tempdb..#queen') IS NOT NULL
DROP TABLE #queen
IF OBJECT_ID('tempdb..#rst') IS NOT NULL
DROP TABLE #rst
IF OBJECT_ID('sp_PutQueen') IS NOT NULL
DROP PROCEDURE sp_PutQueen
IF OBJECT_ID('sp_savequee') IS NOT NULL
DROP PROCEDURE sp_savequee
IF OBJECT_ID('sp_getquee') IS NOT NULL
DROP PROCEDURE sp_getquee
IF OBJECT_ID('sp_CheckQueens') IS NOT NULL
DROP PROCEDURE sp_CheckQueens
SQL实现8皇后问题
最新推荐文章于 2024-10-20 21:16:19 发布