八皇后问题主要是关于实现递归程序方面的知识。
问题描述:
会下象棋的人都知道:皇后可以在横竖,斜线上不限步数的吃掉其他棋子,如何将八个皇后放在棋盘上,使他们谁都不被吃掉,这就是著名的八皇后问题。对于某个满足要求的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 }
题目心得:将题目分析清楚,每一步的细节考虑到位,到哪里该递归,该怎样递归想明白,递归以后需要恢复棋盘的要恢复。