八皇后問題--------------------遞歸回溯

1.八皇后問題

  在 8×8 格的棋盤上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。

2.思路

  這問題很適合用回溯的思想解決。首先在第一行第一列放第一個皇后,然後在第二行第一列放第二個皇后,這時對第二個皇后的列和兩個斜線的方向進行判斷,看是否能攻擊到,如果能攻擊到,那就放在第二列,如果攻擊不到,則繼續在第三行第一列放第三個皇后,繼續按照之前的的方法進行判斷操作。如果放到第八個皇后

則擺法加一。這時可以回溯了,第八行的皇后改變列,看是否滿足條件,滿足則擺法加一,不滿足,則繼續改變列直到所有列都試過。當第八個皇后的所有列都試過過,繼續回溯,按照之前的做法對第七個皇后進行同樣的操作,直到所有皇后都回溯一遍,得到所有擺法。

 

3.如何判斷是否攻擊到

  行的方向不用判斷,每一行只能放一個皇后。列的方向很容易判斷。對於兩個斜線的方向,有一個簡單有效的方法,就是判斷斜率就行了。如果有多個皇后在同一個斜線上,那麼他們的兩個斜線的斜率爲1或-1。皇后所在的列就是x值,所在的行就是y值,如果兩個皇后在同一斜線上那麼他們的x值之差的絕對值一定等於y值差的絕對值。

4.具體思路

  棋盤一般用一個二維數組來表示,但其實可以用一個一維數組queen[8]來表示,索引表示第幾個皇后也就是第幾行,值表示皇后在第幾列。

  代碼如下:

  

 1 #include<math.h>
 2 int count=0;//計算有多少種擺法
 3 //打印具體的擺法
 4 void print(int * queen)
 5 {
 6     int i,j;
 7     for(i=0;i<8;i++)
 8     {
 9         for(j=0;j<8;j++)
10         {
11             if(j==queen[i])
12                 printf("1 "); 
13             else
14                 printf("0 ");
15         }
16         printf("\n");
17     }
18     printf("\n\n");
19 }
20 //判斷是否滿足擺放條件
21 int judge(int * queen,int n)
22 {
23     int i;
24     for(i=0;i<n;i++)
25     {    //列方向                //斜線方向 
26         if(queen[i]==queen[n]||abs(n-i)==abs(queen[n]-queen[i]))
27             return 0;//不滿足返回0 
28     }
29     return 1;//滿足條件,返回1 
30 }
31 
32 void countQueen(int * queen,int n)
33 {    
34     int i;
35     //放到第八個皇后 
36     if(n==8)
37     {    
38         //把擺法打印出來 
39         print(queen);
40         count++;//擺法加一 
41     }
42     else
43     {
44         for(i=0;i<8;i++)
45         {    
46             queen[n]=i;//第n個皇后放在第i列 
47                                 //不滿足繼續循環,改變位置
48             if(judge(queen,n))//如果該位置滿足則放下一個皇后  
49             {                
50                 countQueen(queen,n+1);//放下一個皇后 
51             }
52         }
53     }
54 } 
55 int main()
56 {
57     
58     int queen[8]={0};
59     countQueen(queen,0);
60     printf("一共有 %d 種 \n",count);//打印擺法 
61     return 0;
62 }

 

 該方法其實就是窮舉法,對每一種情況都進行判斷,效率並不高。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章