8皇后问题SQL求解(回溯算法)
问题
八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法
百度来的代码
回溯法用递归实现八皇后解法
declare
type t_queen is varray(8) of number;
queen t_queen := t_queen(1, 2, 3, 4, 5, 6, 7, 8);
l_num number := 0;
-- 显示“八皇后”
procedure show(queen t_queen) is
begin
l_num := l_num + 1;
dbms_output.put_line(rpad('---- NO. ' || l_num || ' ', 16, '-'));
-- 从第1行显示到第8行
for r in 1 .. 8 loop
-- 当前行,从第1列显示到第8列
for c in 1 .. 8 loop
-- “皇后”用“Q”表示,空位用“.”表示
dbms_output.put(case when queen(r) = c then 'Q' else '.'
end || ' ');
end loop;
dbms_output.put_line(null);
end loop;
end;
-- 冲突检测。检测第row行与第1行至第row-1行是否冲突。
-- 不冲突,返回true;冲突返回false
function is_ok(queen t_queen, row number) return boolean is
t number;
begin
for r in 1 .. row - 1 loop
if queen(r) = queen(row) then
-- 第row行与第r行的皇后在同一列上,冲突
return false;
end if;
t := queen(r) - queen(row);
if t = r - row or t = row - r then
-- 第row行与第r行的皇后在同一斜线上,冲突
return false;
end if;
end loop;
return true;
end;
-- 递归查找所有排列
procedure find(queen in out t_queen, row number) is
begin
for col in 1 .. 8 loop
-- 每一行列的位置从第1列到第8列检测
queen(row) := col;
if is_ok(queen, row) then
if row = 8 then
-- 已经查找到第8行,查找结束,显示结果
show(queen);
return;
end if;
find(queen, row + 1); -- 尚未查找到第8行,第归查找一下行
end if;
end loop;
end;
begin
find(queen, 1); -- 从第1行开始查找
end;
运行结果

共92种结果
还有百度到了另外一种更简洁的写法
利用Oracle 11R2版本的递归属性,算法很简单,也就是在斜线上,直线上无冲突即可
with sou as (
select level n,1 k from dual connect by level<=8
),
ntt(n,k) as (
select sou.n ,sou.k from sou where k=1
union all
select ntt.n*10+a.n
,ntt.k+1
from ntt,sou a
where not exists(select 1
from (select level b1 from dual connect by level<=7) t
where t.b1<=ntt.k and (
a.n=to_number(substr(to_char(ntt.n),b1,1)) or
a.n=to_number(substr(to_char(ntt.n),b1,1))+(ntt.k+1-t.b1) or
a.n=to_number(substr(to_char(ntt.n),b1,1))-(ntt.k+1-t.b1)
)
) and ntt.k<=7
)
select n from ntt where ntt.k=8 ;
也是92种结果
结果是一个数字表示在棋盘上的位置,也可以改一下用两位整数表示一个棋位,这样可以扩展到10皇后以上
时间因素:
也即每增加一个皇后,增加的时间约为上一个的e(x+1)倍
8皇后问题SQL求解(回溯算法)的更多相关文章
- 【C/C++】n皇后问题/全排列/递归/回溯/算法笔记4.3
按常规,先说一下我自己的理解. 递归中的return常用来作为递归终止的条件,但是对于返回数值的情况,要搞明白它是怎么返回的.递归的方式就是自己调用自己,而在有返回值的函数中,上一层的函数还没执行完就 ...
- 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同 ...
- 3、回溯算法解题套路框架——Go语言版
前情提示:Go语言学习者.本文参考https://labuladong.gitee.io/algo,代码自己参考抒写,若有不妥之处,感谢指正 关于golang算法文章,为了便于下载和整理,都已开源放在 ...
- 回溯算法之n皇后问题
今天在看深度优先算法的时候,联想到DFS本质不就是一个递归回溯算法问题,只不过它是应用在图论上的.OK,写下这篇博文也是为了回顾一下回溯算法设计吧. 学习回溯算法问题,最为经典的问题我想应该就是八皇后 ...
- 回溯算法-C#语言解决八皇后问题的写法与优化
结合问题说方案,首先先说问题: 八皇后问题:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 嗯,这个问题已经被使用各种语言解 ...
- 回溯算法 LEETCODE别人的小结 一八皇后问题
回溯算法实际上是一个类似枚举的搜索尝试过程,主要是在搜索尝试中寻找问题的解,当发现已不满足求解条件时,就回溯返回,尝试别的路径. 回溯法是一种选优搜索法,按选优条件向前搜索,以达到目的.但是当探索到某 ...
- 回溯算法——解决n皇后问题
所谓回溯(backtracking)是通过系统地搜索求解问题的方法.这种方法适用于类似于八皇后这样的问题:求得问题的一个解比较困难,但是检查一个棋局是否构成解很容易. 不多说,放上n皇后的回溯问题代码 ...
- 算法刷题--回溯算法与N皇后
所谓回溯算法,在笔者看来就是一种直接地思想----假设需要很多步操作才能求得最终的解,每一步操作又有很多种选择,那么我们就直接选择其中一种并依次深入下去.直到求得最终的结果,或是遇到明细的错误,回溯到 ...
- 回溯算法 - n 皇后问题
(1)问题描述 在 n × n 格的棋盘上放置彼此不受攻击的 n 个皇后.按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.n 后问题等价于在 n × n 的棋盘上放置 n 个 ...
随机推荐
- python27期尚哥讲并发编程:
python27day23并发编程----------------------------------------------------------------------------------- ...
- Git分支管理(四)
一.什么是分支 分支的好处: 同时并行推进多个功能开发,提高开发效率 各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任 何影响.失败的分支删除重新开始即可. 二.分支的操作 1. 创建 ...
- zzXDL
Pull requestsIssues Marketplace Explore Learn Git and GitHub without any code! Using ...
- xBIM初步使用
1.新建一个c#项目,在工具->NuGet程序包管理器->程序包管理控制台 输入如下命令: Install-Package Xbim.Essentials -Version 4.0.29 ...
- [POI2014]RAJ(最短路,拓扑排序)
对于一个点 \(x\) 如何求答案? 由于这个图是个有向无环图,可以先拓扑排序一遍,求出每个点的拓扑序,从起点到它的最长路 \(d2\),从它到终点的最长路 \(d1\).(我写代码是这么写的,注意顺 ...
- 洛谷P5437/5442 约定(概率期望,拉格朗日插值,自然数幂)
题目大意:$n$ 个点的完全图,点 $i$ 和点 $j$ 的边权为 $(i+j)^k$.随机一个生成树,问这个生成树边权和的期望对 $998244353$ 取模的值. 对于P5437:$1\le n\ ...
- [LeetCode] 253. Meeting Rooms II 会议室之二
Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] (si ...
- 分页条件传参bug之解决
问题描述:以对象作为参数,对象中包含PageNum.PageSize.Condition对象等.对应的@RequestBody为如PageReqDTO reqDTO时,如果使用postman时,不在b ...
- unity工具开发
1.EditorWindow通过拖拽获取文件夹或者文件路径 #region 拖拽相关 Rect rect4 = EditorGUILayout.GetControlRect(); //将上面的框作为文 ...
- Docker底层原理介绍
1.docker介绍 1.1什么是docker Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻 ...