問題描述:在8*8的西洋棋盤上擺放8個皇后,使其不能互相攻擊,即任何兩個皇后都不能處於同一行、同一列或者同一斜線上,問有多少種擺法。演算法分析:
利用3個數組分表來標記衝突,陣列a、b、c。
a陣列代表列衝突,a[0]~a[7]代表0~7列,如果a[0]=1,則表示第0列已有皇后。
b陣列帶表主對角線衝突,為b[行-列+7],即b[0]~b[14]中如果為1,表示該主對角線有皇后(如下圖)。
c陣列帶表從對角線衝突,為c[行+列],即c[0]~c[14]中如果為1,表示該從對角線有皇后(如下圖)。
c++實現如下:
#include usingpython實現如下:namespace
std;
static
char queen[8][9
];static
int a[8
];static
int b[15
];static
int c[15
];static
int iqueennum=0; //
記錄總的棋盤狀態數
void qu(int i);//
第i行int
main()
}//主、從對角線標記初始化,表示沒有衝突
for(iline=0;iline<15;iline++)
qu(0);
return0;
}void qu(int
i) cout
<
}cout
<
}//如果前次的皇后放置導致後面的放置無論如何都不能滿足要求,則回溯,重置
queen[i][icolumn]='*'
; a[icolumn]=0
; b[i-icolumn+7]=0
; c[i+icolumn]=0
; }}}
#-*- coding:utf-8 -*-
global
queue,a,b,c,queennum
queue=[['*'
for i in range(0,8)] for i in range(0,8)]
a=[0 for i in range(0,8)]
b=[0 for i in range(0,15)]
c=[0 for i in range(0,15)]
queennum=0
'''queue表示整個棋盤
a表示列的衝突
b表示正對角衝突
c表示從對角衝突
queennum表示第幾種擺法
'''def
fun(num):
global
queue, a, b, c, queennum
for icolumn in range(0,8): #
總共8行
if a[icolumn]==0 and b[num-icolumn+7]==0 and c[num+icolumn]==0: #
滿足3個條件
queue[num][icolumn]='@'
a[icolumn]=1 #
該列不能放入皇后
b[num-icolumn+7]=1 #
該正列不能放入皇后
c[num+icolumn]=1 #
該從列不能放入皇后
if num<7:
fun(num+1)
else: #
7行放滿了,輸出
queennum+=1
'第%d種情況:
'%queennum
for j in range(0,8):
print''
.join(queue[j])
print'\n
'#回溯 queue[num][icolumn]='*'
a[icolumn]=0
b[num-icolumn+7]=0
c[num+icolumn]=0
if__name__=='
__main__':
fun(0)
簡單8皇后問題的實現
今天有個朋友給我發了兩張截圖,我一看,哦,原來是左天他遇到8皇后問題了,他說讓我給他看看,我說試試就試試 三.總結 問題表述為 在8 8格的西洋棋上擺放8個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。這裡有個小技巧,就是他已經要求不能在同一行有兩個qu...
8皇后問題
會下西洋棋的人都很清楚 皇后可以在橫 豎 斜線上不限步數地吃掉其他棋子。如何將8個皇后放在棋盤上 有8 8個方格 使它們誰也不能被吃掉!這就是著名的八皇后問題。對於某個滿足要求的8皇后的擺放方法,定義乙個皇后串a與之對應,即a b1b2.b8,其中bi為相應擺法中第i行皇后所處的列數。已經知道8皇后...
8皇后問題
8 皇后問題 描述 八皇后問題是大數學家高斯於1850年提出來的。該問題是在8 8的西洋棋棋盤上放置8個皇后,使得沒有乙個皇后能 吃掉 任何其他乙個皇后,即沒有任何兩個皇后被放置在棋盤的同一行 同一列或同一斜線上。輸出8皇后問題所有結果。輸入 沒有輸入。輸出 每個結果第一行是no n 的形式,n表示...