八皇后
问题
八皇后问题是一个古老而著名的问题。具体为:在 8X8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,请问有多少种摆法。
思路
先将 8X8 格的国际象棋上的每一行作为一个序列,将列上的每一个格子按顺序编号 1,2,3,4,5,6,7,8
-
初始时将第一个皇后放在第一行第一列上,并在序列中进行标记
-
转入下一行进行判断,如果该行该列上已经存在一个皇后,则在该行上将皇后后移一列,如果已经移到了最后一列,则回溯到上一行,将上一行的皇后的位置后移一列
-
判断所在行的皇后是否与以上的所有行是否在同一斜线上,如果在同一斜线上,则将所在行皇后向后移一列,如果如果已经移到了最后一列,则回溯到上一行,将上一行的皇后的位置后移一列
代码
A | B | C | D | ||
---|---|---|---|---|---|
1 | =[0]*8 | >i=1 | A1 存储棋盘的每行的皇后所在的位置,B1 初始起始行 | ||
2 | for i>0 | >A1(i)=A1(i)+1 | B2 设置第 i 行皇后的位置,从 1 开始逐位判断是否合理 | ||
3 | if A1(i)==9 | >A1(i)=0,i=i-1 | next | 如果当前行皇后的位置设置到了最后一列仍旧不合理,则将该行的皇后先移除,回溯到上一行,调整上一行的皇后位置 | |
4 | if i==1 | >i=2 | next | 第一行不用判断,直接进行下一行的判断 | |
5 | =A1(i) | =A1(to(i-1)) | |||
6 | if C5.pos(B5)>0 | next | 如果当前行皇后所在的列已经存在了皇后,将当前行皇后的位置后移一列,重新判断 | ||
7 | if C5.pselect(i-# ==abs(B5-~))>0 | next | 如果当前行皇后所在的斜线已经存在了皇后,将当前行皇后的位置后移一列,重新判断 | ||
8 | >i=i+1 | 如果该行皇后满足条件,跳转到下一行 | |||
9 | if i==9 | =C9|A1.concat() | >i=i-1 | 如果 8 行全部设置完毕,将结果存储,通过修改上一行的结果再次进入到循环,查找下一种摆放方式 | |
10 | =C9.len() | 算出所有摆法的数量 |
英文版