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 个 ...
随机推荐
- JWT权限设计思维导图
- springsecurity的http.permitall与web.ignoring的区别
permitAll配置实例 @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { ...
- CF888G XOR-MST 最小异或生成树
CF888G XOR-MST 链接 CF888G 思路 trie上贪心,先左右两边连边,再用一条边的代价连起左右两颗树.因为内部的边一定比跨两棵树的边权笑,显然是对的. 代码自己瞎yy的.启发式合并 ...
- nowcoder911L 最优子区间
题目链接 思路 用\(f(i,j)\)表示前i个元素,以i为右端点,j为左端点时的答案. 用个"区间修改,单点查询"的线段树维护出第二维.在从左往右枚举i的过程中.将\([lst_ ...
- C++ 中文乱码的问题
乱码的根本原因就是字符串编码的方式也字符串解码方式不一致导致的, 而在我们平常用的编码编码方式一般都是utf-8以gbk之间的相互转换, 下面给出编码方式的转换代码 string UtfToStrin ...
- Qt 调试信息、打印信息、输出到文本
void debug_msg(QVariant msg) { ; QFile file("debug_msg.txt"); ) { i = ; file.open(QFile::W ...
- [******] java多线程连续打印abc
题目描述 建立三个线程A.B.C,A线程打印10次字母A,B线程打印10次字母B,C线程打印10次字母C,但是要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印. 5种方法 使 ...
- [转载]3.11 UiPath存在文本Text Exists的介绍和使用
一.Text Exists的介绍 检查是否在给定的UI元素中找到了文本,输出的是一个布尔值 二.Text Exists在UiPath中的使用 1.打开设计器,在设计库中新建一个Sequence,为序列 ...
- Canal订阅binlog变更并结合kafka实现消息缓冲
阿里Canal项目请先了解:canal 考虑可能binlog大批量变更,如果直接通过Canal订阅binlog变动,会造成CanalClient会瞬间爆掉.为了解决这个问题,我们可以引入kafka做一 ...
- 企业应用向ASP.NET Core迁移
有人说.NET在国内的氛围越来越不行了,看博客园文章的浏览量也起不来.是不是要转Java呢? 没有必要扯起语言的纷争,Java也好C#都只是语言是工具,各有各的使用场景.以前是C#非开源以及不能在Li ...