问题

八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯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求解(回溯算法)的更多相关文章

  1. 【C/C++】n皇后问题/全排列/递归/回溯/算法笔记4.3

    按常规,先说一下我自己的理解. 递归中的return常用来作为递归终止的条件,但是对于返回数值的情况,要搞明白它是怎么返回的.递归的方式就是自己调用自己,而在有返回值的函数中,上一层的函数还没执行完就 ...

  2. 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同 ...

  3. 3、回溯算法解题套路框架——Go语言版

    前情提示:Go语言学习者.本文参考https://labuladong.gitee.io/algo,代码自己参考抒写,若有不妥之处,感谢指正 关于golang算法文章,为了便于下载和整理,都已开源放在 ...

  4. 回溯算法之n皇后问题

    今天在看深度优先算法的时候,联想到DFS本质不就是一个递归回溯算法问题,只不过它是应用在图论上的.OK,写下这篇博文也是为了回顾一下回溯算法设计吧. 学习回溯算法问题,最为经典的问题我想应该就是八皇后 ...

  5. 回溯算法-C#语言解决八皇后问题的写法与优化

    结合问题说方案,首先先说问题: 八皇后问题:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 嗯,这个问题已经被使用各种语言解 ...

  6. 回溯算法 LEETCODE别人的小结 一八皇后问题

    回溯算法实际上是一个类似枚举的搜索尝试过程,主要是在搜索尝试中寻找问题的解,当发现已不满足求解条件时,就回溯返回,尝试别的路径. 回溯法是一种选优搜索法,按选优条件向前搜索,以达到目的.但是当探索到某 ...

  7. 回溯算法——解决n皇后问题

    所谓回溯(backtracking)是通过系统地搜索求解问题的方法.这种方法适用于类似于八皇后这样的问题:求得问题的一个解比较困难,但是检查一个棋局是否构成解很容易. 不多说,放上n皇后的回溯问题代码 ...

  8. 算法刷题--回溯算法与N皇后

    所谓回溯算法,在笔者看来就是一种直接地思想----假设需要很多步操作才能求得最终的解,每一步操作又有很多种选择,那么我们就直接选择其中一种并依次深入下去.直到求得最终的结果,或是遇到明细的错误,回溯到 ...

  9. 回溯算法 - n 皇后问题

    (1)问题描述 在 n × n 格的棋盘上放置彼此不受攻击的 n 个皇后.按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.n 后问题等价于在 n × n 的棋盘上放置 n 个 ...

随机推荐

  1. 搭建稳固的MySQL运维体系

    MySQL 监控要点 MySQL 监控要点,主要涉及服务器和 MySQL 两个方向的监控告警. 在这两个监控告警方向需要重点关注监控策略.监控趋势图及报警方式. 监控策略指的是每个监控项的告警阈值,例 ...

  2. 【Spring IoC】Spring Bean(三)

    一.Spring Bean的定义 被称作 bean 的对象是构成应用程序的支柱也是由 Spring IoC 容器管理的.bean 是一个被实例化,组装,并通过 Spring IoC 容器所管理的对象. ...

  3. 【使用篇二】SpringBoot单元测试(10)

    SpringCloud单元测试:https://www.cnblogs.com/myitnews/p/11796321.html 1. 创建项目Maven Project,修改pom.xml < ...

  4. MDK快速定位硬件异常位置方法(移植SEGGER_HardFaultHandler库),调用show caller code即可快速锁定(参考硬汉哥)

    今天网上看到keil中如果快速定位hardfault的方法参考如下说明:1. MDK的硬件异常分析主要是通过MDK调试状态进行分析的. 文档下载 apnt209.pdf (651 KB, 下载次数: ...

  5. Gym101002E:K-Inversions

    \(Gym101002E:K-Inversions\) 题意描述: 题目连接链接 给定一个长度为\(N\)只包含\(AB\)的字符串,某个\(A\)的位置为\(j\),某个\(B\)的位置为\(i\) ...

  6. oracle--dump 块与块分析 (dump 深入实践二)

    一,建立测试环境 01,一个oracle数据库环境 02,具体数据库实验环境配置 SQL> create user test1 identified by kingle; User create ...

  7. (十三)golang--程序流程控制

    1.顺序控制 若没有判断,没有跳转,程序由上至下依次执行 2.分支控制 单分支if 条件表达式 { 执行代码块} 双分支if 条件表达式 { 执行代码块1} else { 执行代码块2} 多分支if ...

  8. 《构建 QuantLib》正式出版

    <构建 QuantLib>在 leanpub.com 出版了! leanpub.com 上的购买链接:<构建 QuantLib> Luigi 发来贺电:Implementing ...

  9. Prometheus 告警分配到指定接收组

    Prometheus 告警分配到指定接收组 route属性用来设置报警的分发策略,它是一个树状结构,按照深度优先从左向右的顺序进行匹配. 主要处理流程:1. 接收到Alert,根据labels判断属于 ...

  10. excel中统计列中的值在其他列出现的次数多个条件

    excel中统计列中的值在其他列出现的次数多个条件 =COUNTIFS(E2:E373,"=VIP经销商",J2:J373,K2) 解释 E列的第二行到第373行中值 等于 VIP ...