关于八皇后问题

    八皇后问题主要是关于实现递归程序方面的知识。

    问题描述:

     会下象棋的人都知道:皇后可以在横竖,斜线上不限步数的吃掉其他棋子,如何将八个皇后放在棋盘上,使他们谁都不被吃掉,这就是著名的八皇后问题。对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2….b8,其中bi为相应摆法中第i行皇后所处的列数。已经知道8皇后问题有92组解。求出八皇后问题的所有解。

    解题思路:

     使用8*8矩阵作为模拟棋盘,以每一行为单位进行选择放置皇后,在放置皇后的同时将放置的皇后的控制范围画出,在这里画出控制范围的方法是将控制范围上的点都放上该皇后的值,然后递归放置下一行的皇后,放置完后撤销本次放置皇后的控制范围,恢复到原样。使用一个8*8数组模拟棋盘,一个92*8的数组放置解空间。

     具体代码如下:

     

 1 int solution[92][8];
 2 int chess[8][8];
 3 
 4 //void clear(int row,int col);
 5 
 6 /*
 7  如果chess[9][9]矩阵的某个元素为row,则表示不可放;
 8  */
 9 int num = 0;  //用num全局变量纪录当前的解是第几个
10 //int k;
11 //int r,k;
12 
13 void eight_queen(int row)
14 {
15     if (row == 8) {
16         num++;
17         return ;
18     }
19     int i=0,j=0;
20     int m,n,r,k;
21     for (i=0; i<8; i++) {
22         if (chess[row][i] == -1) {
23             chess[row][i] = row;
24             for(k=num;k<92;k++){         //后面的设置采用覆盖的方式覆盖
25                 solution[k][row] = i+1;
26             }
27             
28             for(r=0;r<8;r++)
29                 for(k=0;k<8;k++)
30                 {
31                     if (chess[r][k] == -1 && (k==i || abs(k - i) == abs(r - row) || r == row)) {
32                         chess[r][k] = row;
33                     }
34                 }
35        
36         eight_queen(row+1);
37         
38         //回溯,将设置的棋盘复原
39         for (m=0; m<8; m++) {
40             for (n=0; n<8; n++) {
41                 if (chess[m][n] == row) {      //控制范围上面放上相应的皇后编号
42                     chess[m][n] = -1;
43                 }
44             }
45           }
46         }
47     }
48 }

    题目心得:将题目分析清楚,每一步的细节考虑到位,到哪里该递归,该怎样递归想明白,递归以后需要恢复棋盘的要恢复。

    

    原文作者:八皇后问题
    原文地址: https://www.cnblogs.com/eric-D123/p/5092937.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞