永发信息网

n皇后问题pascal

答案:2  悬赏:10  手机版
解决时间 2021-02-05 02:29
  • 提问者网友:我是我
  • 2021-02-04 18:32
Description 在一个nXn的国际象棋棋盘上放置n(n<=12)个皇后,使它们不能互相攻击(即任意两个皇后不能在同一行、同一列或同一对角线上)。试求出第一种(皇后在第i行最靠前的情况下,以后各行也尽量靠前)排列方案,和所有方法。Input输入一个数n .(n<=12)Output输出所有的排列方案总数。Sample Input Copy 4Sample Output Copy 2HINTSource
最佳答案
  • 五星知识达人网友:你可爱的野爹
  • 2021-02-04 18:45
做法就是深搜,逐行枚举每个皇后的位置,然后用数组记录每列,每个斜线是否有皇后存在以判断当前的位置是否能够放皇后。代码我去写一下,等会补充过来。。。
全部回答
  • 1楼网友:动情书生
  • 2021-02-04 20:02
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;
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯