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 个 ...
随机推荐
- 搭建稳固的MySQL运维体系
MySQL 监控要点 MySQL 监控要点,主要涉及服务器和 MySQL 两个方向的监控告警. 在这两个监控告警方向需要重点关注监控策略.监控趋势图及报警方式. 监控策略指的是每个监控项的告警阈值,例 ...
- 【Spring IoC】Spring Bean(三)
一.Spring Bean的定义 被称作 bean 的对象是构成应用程序的支柱也是由 Spring IoC 容器管理的.bean 是一个被实例化,组装,并通过 Spring IoC 容器所管理的对象. ...
- 【使用篇二】SpringBoot单元测试(10)
SpringCloud单元测试:https://www.cnblogs.com/myitnews/p/11796321.html 1. 创建项目Maven Project,修改pom.xml < ...
- MDK快速定位硬件异常位置方法(移植SEGGER_HardFaultHandler库),调用show caller code即可快速锁定(参考硬汉哥)
今天网上看到keil中如果快速定位hardfault的方法参考如下说明:1. MDK的硬件异常分析主要是通过MDK调试状态进行分析的. 文档下载 apnt209.pdf (651 KB, 下载次数: ...
- Gym101002E:K-Inversions
\(Gym101002E:K-Inversions\) 题意描述: 题目连接链接 给定一个长度为\(N\)只包含\(AB\)的字符串,某个\(A\)的位置为\(j\),某个\(B\)的位置为\(i\) ...
- oracle--dump 块与块分析 (dump 深入实践二)
一,建立测试环境 01,一个oracle数据库环境 02,具体数据库实验环境配置 SQL> create user test1 identified by kingle; User create ...
- (十三)golang--程序流程控制
1.顺序控制 若没有判断,没有跳转,程序由上至下依次执行 2.分支控制 单分支if 条件表达式 { 执行代码块} 双分支if 条件表达式 { 执行代码块1} else { 执行代码块2} 多分支if ...
- 《构建 QuantLib》正式出版
<构建 QuantLib>在 leanpub.com 出版了! leanpub.com 上的购买链接:<构建 QuantLib> Luigi 发来贺电:Implementing ...
- Prometheus 告警分配到指定接收组
Prometheus 告警分配到指定接收组 route属性用来设置报警的分发策略,它是一个树状结构,按照深度优先从左向右的顺序进行匹配. 主要处理流程:1. 接收到Alert,根据labels判断属于 ...
- excel中统计列中的值在其他列出现的次数多个条件
excel中统计列中的值在其他列出现的次数多个条件 =COUNTIFS(E2:E373,"=VIP经销商",J2:J373,K2) 解释 E列的第二行到第373行中值 等于 VIP ...