導入の質問
エイトクイーン問題は、バックグラウンドの質問とチェスにある:どのようにすることができます(8 \ times8 \)を\女王は、他の直接の女王を食べることができないように、チェスボード上の8つのクイーンを配置しますか?この目的のために、任意のクイーンは、横、縦または斜めの線に同じではありません。エイトクイーン問題は、N個の女王を置くことのより一般的な問題に拡張することができます。
解決Nチェスボード上の新しいクイーンにまず、問題をクイーンズ、この位置は、以前にスタックにクイーン、新しい場所の女王配置食べられなくなります。あなたは、行(または列)8つの位置が新しい女王配置する方法がないの(任意の位置に配置し、食べるために古い女王の前に配置されます)の新しい女王を置く場合は、それがスタックからでなければなりませんポップアップ女王の前に位置し、再び別の新しい行の位置(または列)を探しに置くために、この位置はスタックにプッシュされ、そしてこのように種類バックトラック(後戻り)アルゴリズムアプリケーション。
サンプルコード
参考文献[2]からのコード。
global queen
global number
EIGHT=8 #定义堆栈的最大容量
queen=[None]*8 #存放8个皇后的行位置
number=0 #计算总共有几组解的总数
#决定皇后存放的位置
#输出所需要的结果
def print_table():
global number
x=y=0
number+=1
print('')
print('八皇后问题的第%d组解\t' %number)
for x in range(EIGHT):
for y in range(EIGHT):
if x==queen[y]:
print('<q>',end='')
else:
print('<->',end='')
print('\t')
input('\n..按下任意键继续..\n')
#测试在(row,col)上的皇后是否遭受攻击
#若遭受攻击则返回值为1,否则返回0
def attack(row,col):
global queen
i=0
atk=0
offset_row=offset_col=0
while (atk!=1)and i<col:
offset_col=abs(i-col)
offset_row=abs(queen[i]-row)
#判断两皇后是否在同一行或在同一对角线上
if queen[i]==row or offset_row==offset_col:
atk=1
i=i+1
return atk
def decide_position(value):
global queen
i=0
while i<EIGHT:
if attack(i,value)!=1:
queen[value]=i
if value==7:
print_table()
else:
decide_position(value+1)
i=i+1
#主程序
decide_position(0)
実行結果は以下のとおりです。
【参考資料】
[2]呉Canmingは、データ構造を示しています。使用Pythonの[M]北京:清華大学プレス、2018