SQL实现8皇后问题

/*
在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 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值