问题

八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法

百度来的代码

回溯法用递归实现八皇后解法

  1. declare
  2. type t_queen is varray(8) of number;
  3. queen t_queen := t_queen(1, 2, 3, 4, 5, 6, 7, 8);
  4. l_num number := 0;
  5. -- 显示“八皇后”
  6. procedure show(queen t_queen) is
  7. begin
  8. l_num := l_num + 1;
  9. dbms_output.put_line(rpad('---- NO. ' || l_num || ' ', 16, '-'));
  10. -- 从第1行显示到第8
  11. for r in 1 .. 8 loop
  12. -- 当前行,从第1列显示到第8
  13. for c in 1 .. 8 loop
  14. -- “皇后”用“Q”表示,空位用“.”表示
  15. dbms_output.put(case when queen(r) = c then 'Q' else '.'
  16. end || ' ');
  17. end loop;
  18. dbms_output.put_line(null);
  19. end loop;
  20. end;
  21. -- 冲突检测。检测第row行与第1行至第row-1行是否冲突。
  22. -- 不冲突,返回true;冲突返回false
  23. function is_ok(queen t_queen, row number) return boolean is
  24. t number;
  25. begin
  26. for r in 1 .. row - 1 loop
  27. if queen(r) = queen(row) then
  28. -- row行与第r行的皇后在同一列上,冲突
  29. return false;
  30. end if;
  31. t := queen(r) - queen(row);
  32. if t = r - row or t = row - r then
  33. -- row行与第r行的皇后在同一斜线上,冲突
  34. return false;
  35. end if;
  36. end loop;
  37. return true;
  38. end;
  39. -- 递归查找所有排列
  40. procedure find(queen in out t_queen, row number) is
  41. begin
  42. for col in 1 .. 8 loop
  43. -- 每一行列的位置从第1列到第8列检测
  44. queen(row) := col;
  45. if is_ok(queen, row) then
  46. if row = 8 then
  47. -- 已经查找到第8行,查找结束,显示结果
  48. show(queen);
  49. return;
  50. end if;
  51. find(queen, row + 1); -- 尚未查找到第8行,第归查找一下行
  52. end if;
  53. end loop;
  54. end;
  55. begin
  56. find(queen, 1); -- 从第1行开始查找
  57. end;

运行结果

共92种结果

还有百度到了另外一种更简洁的写法

利用Oracle 11R2版本的递归属性,算法很简单,也就是在斜线上,直线上无冲突即可

  1. with sou as (
  2. select level n,1 k from dual connect by level<=8
  3. ),
  4. ntt(n,k) as (
  5. select sou.n ,sou.k from sou where k=1
  6. union all
  7. select ntt.n*10+a.n
  8. ,ntt.k+1
  9. from ntt,sou a
  10. where not exists(select 1
  11. from (select level b1 from dual connect by level<=7) t
  12. where t.b1<=ntt.k and (
  13. a.n=to_number(substr(to_char(ntt.n),b1,1)) or
  14. a.n=to_number(substr(to_char(ntt.n),b1,1))+(ntt.k+1-t.b1) or
  15. a.n=to_number(substr(to_char(ntt.n),b1,1))-(ntt.k+1-t.b1)
  16. )
  17. ) and ntt.k<=7
  18. )
  19. 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. RST复位报文

    复位报文段: 一些特殊情况,TCP一端向另一端发送复位报文,以通知对方关闭链接或者重新建立链接. 产生复位报文的三种情况: 1. 当客户端访问一个不存在的端口时,目标主机会给客户端发送一个复位报文段. ...

  2. input type属性为number时,去掉右边的上下箭头

    加上样式: input::-webkit-outer-spin-button, input::-webkit-inner-spin-button { -webkit-appearance: none; ...

  3. js的call()方法

    // ① 当函数中没有this时,call().apply()和直接执行没有区别 function fn(){ console.log("aaa") } fn() // aaa f ...

  4. win10安装docker并结合Idea2018.1部署springboot项目

    一.准备工作 1..工具:win10,idea2018,maven3.5,jdk8 二.win10安装docker 1.win10安装docker:http://www.runoob.com/dock ...

  5. Django中render_to_response和render的区别(转载)

    转载地址:https://www.douban.com/note/278152737/ 自django1.3开始:render()方法是render_to_response的一个崭新的快捷方式,前者会 ...

  6. leetcode 354. 俄罗斯套娃信封问题(二维排序有关)

    题目描述 给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现.当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样. 请计算最多能有 ...

  7. 【活动公告】Hackathon —— 腾讯云AI API接入迷你赛

    一. 活动简介 编程马拉松(Hackathon)是将热爱软硬件开发的人聚集起来所举办的一项比赛,本次活动由腾讯云AI联合云+社区发起,希望让广大开发者体验到腾讯云AI的魅力.比赛过程中,参赛者可以尽情 ...

  8. kafka的安装和初步使用

    简介 最近开发的项目中,kafka用的比较多,为了方便梳理,从今天起准备记录一些关于kafka的文章,首先,当然是如何安装kafka了. Apache Kafka是分布式发布-订阅消息系统. Apac ...

  9. SWIG 3 中文手册——3. Windows 上使用 SWIG

    目录 3 Windows 上使用 SWIG 后续章节 3 Windows 上使用 SWIG 暂时略过. 后续章节 <4. 脚本语言>

  10. java识别死亡或者存活的对象

    那些内存需要回收 内存回收是对运行时内存区域的内存回收,其中程序计数器.虚拟机栈.本地方法栈3个区域随线程而生,随线程而灭:栈中的栈帧随着方法的进入和退出而有条不紊的执行着出栈和入栈操作.每一个栈帧中 ...