回溯法解決八皇問題

2021-09-21 17:00:17 字數 2611 閱讀 5179

把八個皇后放在乙個8*8的棋盤上面,要求同一行、同一列、同一對角線不能有兩個皇后。

思路:關鍵在於判定兩個皇后是否在同一行、同一列或同一對角線上。這裡,棋盤下標從1開始算起。

觀察發現:

若是在同一行,則行號相同;若在同一列,則列號相同;

若在同一「/」對角線,則行列值之和相同;若是在同一「\」對角線,則行列值之差相同。

考慮到每行僅有乙個皇后,設一維陣列a[1...8]表示皇后的位置:第i行第j列放置皇后,則a[i]=j,即下標是行數,值是列數。

判斷皇后是否安全,即檢查同一列、同一對角線是否已經有皇后。

建立標誌陣列b[1...8]能控制同一列只能有乙個皇后。

若兩個皇后在同一對角線上,則其行列值之和或差相等,故亦可以建立標誌陣列c[1...16],d[-7..7]控制同一對角線上只能有乙個皇后。(注意:這裡的c和d陣列是對應主、副各自16條對角線的.)

若是斜線不分方向,則同一斜線上兩個皇后的行號之差的絕對值與列號之差的絕對值相等。

在這種方式下,要表示兩個皇后i和j不在同一列或斜線上的條件可以描述為:(a[i]!=a[j])&&(abs(a[i]-a[j]))

i和j分別表示兩個皇后的行號。

具體**如下:

1 #include 2 #include 3

intn;

4int sum=0,a[100];//

sum表示總的方案數。a[i]=x表示第i行放在x列

5int b[100]=,c[100]=,d[100]=;6//

b[i]=1表示第i列有皇后。7//

c[i]=1表示按從左上到右下順序的第i條副對角線(「/」對角線)上有皇后8//

d[i]=1表示按從右上到左下順序的第i條主對角線(「\」對角線)上有皇后

9int search(int i);//

遞迴回溯放置第i個皇后(放在第i行)

10void print(); //

輸出方案

11int

main()

1218

int search(int i)//

遞迴回溯放置第i個皇后(放在第i行)

1931}32

}33void

print()

34

ps:個人覺得該段**裡面標誌陣列b、c、d用的非常巧妙。

上面的**是多用了兩個陣列c、d簡化了判斷。假如只用乙個陣列b也能夠判斷皇后會否衝突,只是時間效率降低了很多。**如下:

1 #include 2

intn;

3int sum=0,a[100]; //

sum表示總的方案數。a[i]=x表示第i行放在x列

4int b[100]=; //

b[i]=1表示第i列有皇后。56

int search(int i);//

遞迴回溯放置第i個皇后(放在第i行)

7void print(); //

輸出方案

8int

main()915

int search(int i)//

遞迴回溯放置第i個皇后(放在第i行)

1627

if(k==i)//

前i-1個皇后不與第i個皇后衝突

2835}36

}37}38

void

print()

39

view code

輸出二維陣列結果:

1 #include2 #include3 #include

4intn;5

int sum=0,a[100];//

sum表示總的方案數。a[i]=x表示第i行放在x列

6int b[100]=,c[100]=,d[100]=;7//

b[i]=1表示第i列有皇后。8//

c[i]=1表示按從左上到右下順序的第i條副對角線(「/」對角線)上有皇后9//

d[i]=1表示按從右上到左下順序的第i條主對角線(「\」對角線)上有皇后

1011

int search(int i);//

遞迴回溯放置第i個皇后(放在第i行)

12void print(); //

輸出方案

13int

main()

1420

int search(int i)//

遞迴回溯放置第i個皇后(放在第i行)

2133}34

}35void

print()36;

39 sum++;

40 printf("

no. %d\n

",sum);

41for(i=1;i<=n;i++)

42 printf("

%-4d

",a[i]);

43//

t[i][a[i]]=1;

44/*

for(i=1;i<=n;i++)

45*/

50 printf("\n"

);51 }

view code

回溯法解決八皇后問題

在西洋棋棋盤上 8 8 放置八個皇后,使得任意兩個皇后之間不能在同一行,同一列,也不能位於同於對角線上。問共有多少種不同的方法,並且指出各種不同的放法。使用回溯法依次假設皇后的位置,當第乙個皇后確定後,尋找下一行的皇后位置,當滿足左上 右上和正上方向無皇后,即矩陣中對應位置都為0,則可以確定皇后位置...

演算法 回溯法解決八皇后問題

八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。八皇后問題 author dustdawn date 2019 8...

八皇后問題(回溯法)

問題描述 八皇后問題是十九世紀著名數學家高斯於1850年提出的。問題是 在8 8的棋盤上擺放8個皇后,使其不能互相攻擊,即任意的兩個皇后不能處在同意行,同一列,或同意斜線上。可以把八皇后問題拓展為n皇后問題,即在n n的棋盤上擺放n個皇后,使其任意兩個皇后都不能處於同一行 同一列或同一斜線上。問題分...