问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

八皇后的算法问题?

发布网友 发布时间:2022-04-10 23:30

我来回答

2个回答

懂视网 时间:2022-04-11 03:51

问题

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

标签:rac   img   --   with   array   数字   height   mamicode   begin   

热心网友 时间:2022-04-11 00:59

Left[15],Right[15];
是用来标记对角线的上是否有皇后。
分别表示\这个方向和/这个方向。
你会发现,对于2维数组下标来说。
/这个方向的下标它的和一样,就说明在一条\线上。
\这个方向就是它的差值是一样的。由于会有负值,所以题目中加了个7.
Left[n+h]=true;
Right[n-h+7]=true;
八皇后问题,的解法是个典型的回溯求解。
每一次针对一行,然后改行有8个位置可供选择,然后根据
int
col[8],Left[15],Right[15];
这个标识选择性的放皇后。然后在递归进入下一行。
它的搜索过程类似深度优先搜索。只不过它搜索的时候,会判断当前节点是否可能是解,不是解,它就不扩展了。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
三七粉贵吗多少钱一斤 三七粉多少钱一斤 万达有什么app 如何避免好学生成为心态受害者? 为什么好学生心态会害了自己呢? 好学生心态受害者是怎样一种存在? 好学生心态有什么影响? 好学生心态受害者是指什么意思? “好学生心态受害者”是指哪些人? 好学生心态受害者是指谁呢? 好学生心态受害者是指什么人? UG12.0安装打不开,许可文件启动不了,各种方法都试过了,求大神帮帮忙,谢谢了!!! 启动UG5.0出现许可证错误该怎么办啊 ? qq手机版怎么弄透明 八皇后究竟有多少种解法?怎么解? 京东商城返修发错了发货单号怎么办 冬天野钓鲫鱼子线多长 我想要徐良的微博 告诉我 谢谢 最好再加上他的QQ号码 我超崇拜他的 对了我知道小美的QQ号是真的 373344288 如何查询iphone激活时间?我的序列号是C36GVR1CDPMW 我的野蛮女友古装版现在在海选女主角可是我不知道在哪里报名,微博里只是说了在海选,但是并没有说报名方 怎样能快速的找到技嘉GA-845GV的主板驱动程序呢? 急急!!请问有人知道这个 GV 的名字 么?或者里面那个男的的名字~谢谢 发现老爹的电脑里有GV 浮力公式为 F浮=G物=M排G=P密度GV排 怎么分析啊 有谁知道这个showgirl的微博 美人鱼美人鱼世界上最美的美人鱼大美微博尾巴怎么办呢我要看美人鱼 在哪里可以找到章致宇老师,他带人真的那么厉害吗? 我真的找不到gv怎么办 八皇后问题求解方法分类 足贴放姜片贴背部排出水来是怎么回事 艾草足贴多少钱一包 QQ邮箱如何发送可执行文件? 约翰-萨尔蒙斯的资料 约翰-萨尔蒙斯的简介 约翰·萨尔蒙斯的人物评价 约翰-萨尔蒙斯表现怎么样 求NBA公牛队约翰·萨尔蒙斯简介 约翰-萨尔蒙斯目前在哪支球队 约翰-萨尔蒙斯的最新消息 今夏NBA都有哪些重要球星转会了? 02年的选秀上姚明是第一而第二,三是谁啊!他们分别在那支球队 猛龙队,NBA猛龙队,多伦多猛龙队介绍 本赛季至今为止的nba交易的列表 求2k10最新球员名单 求本赛季NBA常规赛最后临近交易截止日期前,共发生了那些交易~ 哪些明星加盟过公牛队 2009年公牛队阵容 2002年NBA选秀第一轮和第二轮共有多少人?具体排位是怎样的 83×127-35×16-11乘35 数据结构用栈和回溯法解决八皇后问题 笔记本打游戏时突然掉帧