永发信息网

n皇后问题pascal

答案:2  悬赏:10  手机版
解决时间 2021-02-05 02:29
Description 在一个nXn的国际象棋棋盘上放置n(n<=12)个皇后,使它们不能互相攻击(即任意两个皇后不能在同一行、同一列或同一对角线上)。试求出第一种(皇后在第i行最靠前的情况下,以后各行也尽量靠前)排列方案,和所有方法。Input输入一个数n .(n<=12)Output输出所有的排列方案总数。Sample Input Copy 4Sample Output Copy 2HINTSource
最佳答案
做法就是深搜,逐行枚举每个皇后的位置,然后用数组记录每列,每个斜线是否有皇后存在以判断当前的位置是否能够放皇后。代码我去写一下,等会补充过来。。。
全部回答
n皇后问题(非递归) top := 1; // 从第一个皇后开始尝试 while (top > 0) do // 当还有活动节点时循环 if (top > n) then // 是否n个皇后都放置在棋盘了 begin inc(count); // 找到一组解,总数加一 dec(top); // 回到上一皇后继续 end else // n个皇后还没有都放置好 begin inc(x[top]); // 当前皇后到下一列 if (x[top] > n) then // 是否超出棋盘 dec(top) // 超出棋盘,回到上一个皇后继续 else // 没有超出棋盘 if check(top) then // 检查当前位置是否可以放皇后 begin inc(top); // 可以放置,继续尝试下一个皇后 x[top] := 0; // 下一个皇后从第一列开始尝试 end; end; n皇后问题(边界判定) function check(pos: integer): boolean; var i: integer; begin check := true; for i := 1 to pos - 1 do if (x[pos] = x[i]) or (abs(x[pos] - x[i]) = abs(pos - i)) then begin check := false; break; end; end; n皇后问题(递归) procedure search(k: integer); var i: integer; begin if k > n then // 是否前n个皇后都已经放下 inc(count) else // 还有皇后没放 for i := 1 to n do // 从第1列开始逐列尝试 begin x[k] := i; // 把第k个皇后放在第i列 if check(k) then // 第k个皇后是否可以放在第i列 search(k + 1); // 可以放,继续处理第k+1个皇后 end; end;
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
本人已经戒色戒了有断时间了,到时最近几天又
中国联通(海口营业厅)(海华路与201省道交叉口
品胜电池怎么样
【没有他会死】...你失去了他就会死的那种。
中国联通(腾辉通讯)(洪宽大道东50米中国联通)
鹏程大酒店-棋牌室怎么去啊,有知道地址的么
万苦千辛的意思是什么啊?知道的请说下!
Sally人名 什么意思啊!
T字开头的火车的高软啥意思
天珠上供寺庙可以吗
中国联通(五一营业厅)(新港街道五一中路191号
边长为一的正方形ABCD内随机一点M,则点M到点D
金美佳超市在哪里啊,我有事要去这个地方
中国联通(小桥营业厅)(融城小桥街邮政大厦)地
哪一家提供的雷茨RAETTS风机产品是正品?
推荐资讯
foxmail怎样在收邮件时自动分组
蜀山菜市绿怡居菜市场这个地址在什么地方,我
氢原子基态能量E1=-13.6eV,电子绕核运动半径r
盛世文玩地址在什么地方,想过去办事
牛驼中心网咖怎么去啊,我要去那办事
职业生涯中,发生了哪些事情代表着成功
企业名称: 湖北银泰投资担保有限公司 ( 查
邮政储蓄银行星期六日上班吗
三十一画带有木字的女孩姓高的名字
富康社区停车场地址有知道的么?有点事想过去
请用《山市》的原文回答以下问题
噪声评价中当工程预测的不同代表性时段噪声级
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?