八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。来自Wikipedia。
采用的思想是递归。
主要实现几个函数:
void print_board()
:能够打印棋盘上皇后的位置。
int conflicts( int row, int column )
:检查一个位置是否冲突。
void place_queen( int row )
:放置皇后,由于采用递归,所以一行放置就行。
实现代码:
/*
** Solve the Eight Queens Problem.
*/
#include
#include
#define TRUE 1
#define FALSE 0
int board[8][8] = { 0 };
void print_board()
{
int row;
int column;
static int n_solutions; //calculate the solutions
n_solutions += 1;
printf( "Solution #%d:\n", n_solutions );
for( row = 0; row < 8; row += 1 ){
for( column = 0; column < 8; column += 1 ){
if( board[ row ][ column ] )
printf( " Q" );
else
printf( " +" );
}
putchar('\n');
}
putchar('\n');
}
int conflicts( int row, int column )
{
int i;
for( i = 1; i < 8; i++ ) {
//check up,left,right
if( row - i >= 0 && board[row-i][column])
return TRUE;
if( column - i >= 0 && board[row][column - i])
return TRUE;
if( column + i < 8 && board[row][column + i])
return TRUE;
//check diagonals: up and left, up an right
if( row - i >= 0 && column - i >=0
&& board[row - i][column - i])
return TRUE;
if(row - i >= 0 && column + i < 8
&& board[row - i][column + i])
return TRUE;
}
return FALSE;
}
void place_queen( int row )
{
int column;
for(column = 0; column < 8; column++) {
board[row][column] = TRUE;
if( row == 0 || !conflicts(row, column)) {
if( row < 7 )
place_queen(row + 1);
else
print_board();
}
board[row][column] = FALSE;
}
}
int main(int argc, char const *argv[])
{
place_queen(0);
return 0;
}
讲解:
conflicts
函数检测的时候可以省略,就像上面的代码一样,因为棋盘下面的还没有放置。
place_queen
:我们现在第一行进行放置,将一个地方置为TRUE
,用if
检测是否冲突,不冲突并且还没填满,那就递归进入下一行填充(假设进入下一行填充失败,那么就将置为TRUE
的改成FALSE
)。当检测到row == 7
时,也就意味着填满了,就将棋盘打印出来。
这能将所有解法都找到。
结果:
Solution #1:
Q + + + + + + +
+ + + + Q + + +
+ + + + + + + Q
+ + + + + Q + +
+ + Q + + + + +
+ + + + + + Q +
+ Q + + + + + +
+ + + Q + + + +
Solution #2:
Q + + + + + + +
+ + + + + Q + +
+ + + + + + + Q
+ + Q + + + + +
+ + + + + + Q +
+ + + Q + + + +
+ Q + + + + + +
+ + + + Q + + +
Solution #3:
Q + + + + + + +
+ + + + + + Q +
+ + + Q + + + +
+ + + + + Q + +
+ + + + + + + Q
+ Q + + + + + +
+ + + + Q + + +
+ + Q + + + + +
Solution #4:
Q + + + + + + +
+ + + + + + Q +
+ + + + Q + + +
+ + + + + + + Q
+ Q + + + + + +
+ + + Q + + + +
+ + + + + Q + +
+ + Q + + + + +
Solution #5:
+ Q + + + + + +
+ + + Q + + + +
+ + + + + Q + +
+ + + + + + + Q
+ + Q + + + + +
Q + + + + + + +
+ + + + + + Q +
+ + + + Q + + +
Solution #6:
+ Q + + + + + +
+ + + + Q + + +
+ + + + + + Q +
Q + + + + + + +
+ + Q + + + + +
+ + + + + + + Q
+ + + + + Q + +
+ + + Q + + + +
Solution #7:
+ Q + + + + + +
+ + + + Q + + +
+ + + + + + Q +
+ + + Q + + + +
Q + + + + + + +
+ + + + + + + Q
+ + + + + Q + +
+ + Q + + + + +
Solution #8:
+ Q + + + + + +
+ + + + + Q + +
Q + + + + + + +
+ + + + + + Q +
+ + + Q + + + +
+ + + + + + + Q
+ + Q + + + + +
+ + + + Q + + +
Solution #9:
+ Q + + + + + +
+ + + + + Q + +
+ + + + + + + Q
+ + Q + + + + +
Q + + + + + + +
+ + + Q + + + +
+ + + + + + Q +
+ + + + Q + + +
Solution #10:
+ Q + + + + + +
+ + + + + + Q +
+ + Q + + + + +
+ + + + + Q + +
+ + + + + + + Q
+ + + + Q + + +
Q + + + + + + +
+ + + Q + + + +
Solution #11:
+ Q + + + + + +
+ + + + + + Q +
+ + + + Q + + +
+ + + + + + + Q
Q + + + + + + +
+ + + Q + + + +
+ + + + + Q + +
+ + Q + + + + +
Solution #12:
+ Q + + + + + +
+ + + + + + + Q
+ + + + + Q + +
Q + + + + + + +
+ + Q + + + + +
+ + + + Q + + +
+ + + + + + Q +
+ + + Q + + + +
Solution #13:
+ + Q + + + + +
Q + + + + + + +
+ + + + + + Q +
+ + + + Q + + +
+ + + + + + + Q
+ Q + + + + + +
+ + + Q + + + +
+ + + + + Q + +
Solution #14:
+ + Q + + + + +
+ + + + Q + + +
+ Q + + + + + +
+ + + + + + + Q
Q + + + + + + +
+ + + + + + Q +
+ + + Q + + + +
+ + + + + Q + +
Solution #15:
+ + Q + + + + +
+ + + + Q + + +
+ Q + + + + + +
+ + + + + + + Q
+ + + + + Q + +
+ + + Q + + + +
+ + + + + + Q +
Q + + + + + + +
Solution #16:
+ + Q + + + + +
+ + + + Q + + +
+ + + + + + Q +
Q + + + + + + +
+ + + Q + + + +
+ Q + + + + + +
+ + + + + + + Q
+ + + + + Q + +
Solution #17:
+ + Q + + + + +
+ + + + Q + + +
+ + + + + + + Q
+ + + Q + + + +
Q + + + + + + +
+ + + + + + Q +
+ Q + + + + + +
+ + + + + Q + +
Solution #18:
+ + Q + + + + +
+ + + + + Q + +
+ Q + + + + + +
+ + + + Q + + +
+ + + + + + + Q
Q + + + + + + +
+ + + + + + Q +
+ + + Q + + + +
Solution #19:
+ + Q + + + + +
+ + + + + Q + +
+ Q + + + + + +
+ + + + + + Q +
Q + + + + + + +
+ + + Q + + + +
+ + + + + + + Q
+ + + + Q + + +
Solution #20:
+ + Q + + + + +
+ + + + + Q + +
+ Q + + + + + +
+ + + + + + Q +
+ + + + Q + + +
Q + + + + + + +
+ + + + + + + Q
+ + + Q + + + +
Solution #21:
+ + Q + + + + +
+ + + + + Q + +
+ + + Q + + + +
Q + + + + + + +
+ + + + + + + Q
+ + + + Q + + +
+ + + + + + Q +
+ Q + + + + + +
Solution #22:
+ + Q + + + + +
+ + + + + Q + +
+ + + Q + + + +
+ Q + + + + + +
+ + + + + + + Q
+ + + + Q + + +
+ + + + + + Q +
Q + + + + + + +
Solution #23:
+ + Q + + + + +
+ + + + + Q + +
+ + + + + + + Q
Q + + + + + + +
+ + + Q + + + +
+ + + + + + Q +
+ + + + Q + + +
+ Q + + + + + +
Solution #24:
+ + Q + + + + +
+ + + + + Q + +
+ + + + + + + Q
Q + + + + + + +
+ + + + Q + + +
+ + + + + + Q +
+ Q + + + + + +
+ + + Q + + + +
Solution #25:
+ + Q + + + + +
+ + + + + Q + +
+ + + + + + + Q
+ Q + + + + + +
+ + + Q + + + +
Q + + + + + + +
+ + + + + + Q +
+ + + + Q + + +
Solution #26:
+ + Q + + + + +
+ + + + + + Q +
+ Q + + + + + +
+ + + + + + + Q
+ + + + Q + + +
Q + + + + + + +
+ + + Q + + + +
+ + + + + Q + +
Solution #27:
+ + Q + + + + +
+ + + + + + Q +
+ Q + + + + + +
+ + + + + + + Q
+ + + + + Q + +
+ + + Q + + + +
Q + + + + + + +
+ + + + Q + + +
Solution #28:
+ + Q + + + + +
+ + + + + + + Q
+ + + Q + + + +
+ + + + + + Q +
Q + + + + + + +
+ + + + + Q + +
+ Q + + + + + +
+ + + + Q + + +
Solution #29:
+ + + Q + + + +
Q + + + + + + +
+ + + + Q + + +
+ + + + + + + Q
+ Q + + + + + +
+ + + + + + Q +
+ + Q + + + + +
+ + + + + Q + +
Solution #30:
+ + + Q + + + +
Q + + + + + + +
+ + + + Q + + +
+ + + + + + + Q
+ + + + + Q + +
+ + Q + + + + +
+ + + + + + Q +
+ Q + + + + + +
Solution #31:
+ + + Q + + + +
+ Q + + + + + +
+ + + + Q + + +
+ + + + + + + Q
+ + + + + Q + +
Q + + + + + + +
+ + Q + + + + +
+ + + + + + Q +
Solution #32:
+ + + Q + + + +
+ Q + + + + + +
+ + + + + + Q +
+ + Q + + + + +
+ + + + + Q + +
+ + + + + + + Q
Q + + + + + + +
+ + + + Q + + +
Solution #33:
+ + + Q + + + +
+ Q + + + + + +
+ + + + + + Q +
+ + Q + + + + +
+ + + + + Q + +
+ + + + + + + Q
+ + + + Q + + +
Q + + + + + + +
Solution #34:
+ + + Q + + + +
+ Q + + + + + +
+ + + + + + Q +
+ + + + Q + + +
Q + + + + + + +
+ + + + + + + Q
+ + + + + Q + +
+ + Q + + + + +
Solution #35:
+ + + Q + + + +
+ Q + + + + + +
+ + + + + + + Q
+ + + + Q + + +
+ + + + + + Q +
Q + + + + + + +
+ + Q + + + + +
+ + + + + Q + +
Solution #36:
+ + + Q + + + +
+ Q + + + + + +
+ + + + + + + Q
+ + + + + Q + +
Q + + + + + + +
+ + Q + + + + +
+ + + + Q + + +
+ + + + + + Q +
Solution #37:
+ + + Q + + + +
+ + + + + Q + +
Q + + + + + + +
+ + + + Q + + +
+ Q + + + + + +
+ + + + + + + Q
+ + Q + + + + +
+ + + + + + Q +
Solution #38:
+ + + Q + + + +
+ + + + + Q + +
+ + + + + + + Q
+ Q + + + + + +
+ + + + + + Q +
Q + + + + + + +
+ + Q + + + + +
+ + + + Q + + +
Solution #39:
+ + + Q + + + +
+ + + + + Q + +
+ + + + + + + Q
+ + Q + + + + +
Q + + + + + + +
+ + + + + + Q +
+ + + + Q + + +
+ Q + + + + + +
Solution #40:
+ + + Q + + + +
+ + + + + + Q +
Q + + + + + + +
+ + + + + + + Q
+ + + + Q + + +
+ Q + + + + + +
+ + + + + Q + +
+ + Q + + + + +
Solution #41:
+ + + Q + + + +
+ + + + + + Q +
+ + Q + + + + +
+ + + + + + + Q
+ Q + + + + + +
+ + + + Q + + +
Q + + + + + + +
+ + + + + Q + +
Solution #42:
+ + + Q + + + +
+ + + + + + Q +
+ + + + Q + + +
+ Q + + + + + +
+ + + + + Q + +
Q + + + + + + +
+ + Q + + + + +
+ + + + + + + Q
Solution #43:
+ + + Q + + + +
+ + + + + + Q +
+ + + + Q + + +
+ + Q + + + + +
Q + + + + + + +
+ + + + + Q + +
+ + + + + + + Q
+ Q + + + + + +
Solution #44:
+ + + Q + + + +
+ + + + + + + Q
Q + + + + + + +
+ + Q + + + + +
+ + + + + Q + +
+ Q + + + + + +
+ + + + + + Q +
+ + + + Q + + +
Solution #45:
+ + + Q + + + +
+ + + + + + + Q
Q + + + + + + +
+ + + + Q + + +
+ + + + + + Q +
+ Q + + + + + +
+ + + + + Q + +
+ + Q + + + + +
Solution #46:
+ + + Q + + + +
+ + + + + + + Q
+ + + + Q + + +
+ + Q + + + + +
Q + + + + + + +
+ + + + + + Q +
+ Q + + + + + +
+ + + + + Q + +
Solution #47:
+ + + + Q + + +
Q + + + + + + +
+ + + Q + + + +
+ + + + + Q + +
+ + + + + + + Q
+ Q + + + + + +
+ + + + + + Q +
+ + Q + + + + +
Solution #48:
+ + + + Q + + +
Q + + + + + + +
+ + + + + + + Q
+ + + Q + + + +
+ Q + + + + + +
+ + + + + + Q +
+ + Q + + + + +
+ + + + + Q + +
Solution #49:
+ + + + Q + + +
Q + + + + + + +
+ + + + + + + Q
+ + + + + Q + +
+ + Q + + + + +
+ + + + + + Q +
+ Q + + + + + +
+ + + Q + + + +
Solution #50:
+ + + + Q + + +
+ Q + + + + + +
+ + + Q + + + +
+ + + + + Q + +
+ + + + + + + Q
+ + Q + + + + +
Q + + + + + + +
+ + + + + + Q +
Solution #51:
+ + + + Q + + +
+ Q + + + + + +
+ + + Q + + + +
+ + + + + + Q +
+ + Q + + + + +
+ + + + + + + Q
+ + + + + Q + +
Q + + + + + + +
Solution #52:
+ + + + Q + + +
+ Q + + + + + +
+ + + + + Q + +
Q + + + + + + +
+ + + + + + Q +
+ + + Q + + + +
+ + + + + + + Q
+ + Q + + + + +
Solution #53:
+ + + + Q + + +
+ Q + + + + + +
+ + + + + + + Q
Q + + + + + + +
+ + + Q + + + +
+ + + + + + Q +
+ + Q + + + + +
+ + + + + Q + +
Solution #54:
+ + + + Q + + +
+ + Q + + + + +
Q + + + + + + +
+ + + + + Q + +
+ + + + + + + Q
+ Q + + + + + +
+ + + Q + + + +
+ + + + + + Q +
Solution #55:
+ + + + Q + + +
+ + Q + + + + +
Q + + + + + + +
+ + + + + + Q +
+ Q + + + + + +
+ + + + + + + Q
+ + + + + Q + +
+ + + Q + + + +
Solution #56:
+ + + + Q + + +
+ + Q + + + + +
+ + + + + + + Q
+ + + Q + + + +
+ + + + + + Q +
Q + + + + + + +
+ + + + + Q + +
+ Q + + + + + +
Solution #57:
+ + + + Q + + +
+ + + + + + Q +
Q + + + + + + +
+ + Q + + + + +
+ + + + + + + Q
+ + + + + Q + +
+ + + Q + + + +
+ Q + + + + + +
Solution #58:
+ + + + Q + + +
+ + + + + + Q +
Q + + + + + + +
+ + + Q + + + +
+ Q + + + + + +
+ + + + + + + Q
+ + + + + Q + +
+ + Q + + + + +
Solution #59:
+ + + + Q + + +
+ + + + + + Q +
+ Q + + + + + +
+ + + Q + + + +
+ + + + + + + Q
Q + + + + + + +
+ + Q + + + + +
+ + + + + Q + +
Solution #60:
+ + + + Q + + +
+ + + + + + Q +
+ Q + + + + + +
+ + + + + Q + +
+ + Q + + + + +
Q + + + + + + +
+ + + Q + + + +
+ + + + + + + Q
Solution #61:
+ + + + Q + + +
+ + + + + + Q +
+ Q + + + + + +
+ + + + + Q + +
+ + Q + + + + +
Q + + + + + + +
+ + + + + + + Q
+ + + Q + + + +
Solution #62:
+ + + + Q + + +
+ + + + + + Q +
+ + + Q + + + +
Q + + + + + + +
+ + Q + + + + +
+ + + + + + + Q
+ + + + + Q + +
+ Q + + + + + +
Solution #63:
+ + + + Q + + +
+ + + + + + + Q
+ + + Q + + + +
Q + + + + + + +
+ + Q + + + + +
+ + + + + Q + +
+ Q + + + + + +
+ + + + + + Q +
Solution #64:
+ + + + Q + + +
+ + + + + + + Q
+ + + Q + + + +
Q + + + + + + +
+ + + + + + Q +
+ Q + + + + + +
+ + + + + Q + +
+ + Q + + + + +
Solution #65:
+ + + + + Q + +
Q + + + + + + +
+ + + + Q + + +
+ Q + + + + + +
+ + + + + + + Q
+ + Q + + + + +
+ + + + + + Q +
+ + + Q + + + +
Solution #66:
+ + + + + Q + +
+ Q + + + + + +
+ + + + + + Q +
Q + + + + + + +
+ + Q + + + + +
+ + + + Q + + +
+ + + + + + + Q
+ + + Q + + + +
Solution #67:
+ + + + + Q + +
+ Q + + + + + +
+ + + + + + Q +
Q + + + + + + +
+ + + Q + + + +
+ + + + + + + Q
+ + + + Q + + +
+ + Q + + + + +
Solution #68:
+ + + + + Q + +
+ + Q + + + + +
Q + + + + + + +
+ + + + + + Q +
+ + + + Q + + +
+ + + + + + + Q
+ Q + + + + + +
+ + + Q + + + +
Solution #69:
+ + + + + Q + +
+ + Q + + + + +
Q + + + + + + +
+ + + + + + + Q
+ + + Q + + + +
+ Q + + + + + +
+ + + + + + Q +
+ + + + Q + + +
Solution #70:
+ + + + + Q + +
+ + Q + + + + +
Q + + + + + + +
+ + + + + + + Q
+ + + + Q + + +
+ Q + + + + + +
+ + + Q + + + +
+ + + + + + Q +
Solution #71:
+ + + + + Q + +
+ + Q + + + + +
+ + + + Q + + +
+ + + + + + Q +
Q + + + + + + +
+ + + Q + + + +
+ Q + + + + + +
+ + + + + + + Q
Solution #72:
+ + + + + Q + +
+ + Q + + + + +
+ + + + Q + + +
+ + + + + + + Q
Q + + + + + + +
+ + + Q + + + +
+ Q + + + + + +
+ + + + + + Q +
Solution #73:
+ + + + + Q + +
+ + Q + + + + +
+ + + + + + Q +
+ Q + + + + + +
+ + + Q + + + +
+ + + + + + + Q
Q + + + + + + +
+ + + + Q + + +
Solution #74:
+ + + + + Q + +
+ + Q + + + + +
+ + + + + + Q +
+ Q + + + + + +
+ + + + + + + Q
+ + + + Q + + +
Q + + + + + + +
+ + + Q + + + +
Solution #75:
+ + + + + Q + +
+ + Q + + + + +
+ + + + + + Q +
+ + + Q + + + +
Q + + + + + + +
+ + + + + + + Q
+ Q + + + + + +
+ + + + Q + + +
Solution #76:
+ + + + + Q + +
+ + + Q + + + +
Q + + + + + + +
+ + + + Q + + +
+ + + + + + + Q
+ Q + + + + + +
+ + + + + + Q +
+ + Q + + + + +
Solution #77:
+ + + + + Q + +
+ + + Q + + + +
+ Q + + + + + +
+ + + + + + + Q
+ + + + Q + + +
+ + + + + + Q +
Q + + + + + + +
+ + Q + + + + +
Solution #78:
+ + + + + Q + +
+ + + Q + + + +
+ + + + + + Q +
Q + + + + + + +
+ + Q + + + + +
+ + + + Q + + +
+ Q + + + + + +
+ + + + + + + Q
Solution #79:
+ + + + + Q + +
+ + + Q + + + +
+ + + + + + Q +
Q + + + + + + +
+ + + + + + + Q
+ Q + + + + + +
+ + + + Q + + +
+ + Q + + + + +
Solution #80:
+ + + + + Q + +
+ + + + + + + Q
+ Q + + + + + +
+ + + Q + + + +
Q + + + + + + +
+ + + + + + Q +
+ + + + Q + + +
+ + Q + + + + +
Solution #81:
+ + + + + + Q +
Q + + + + + + +
+ + Q + + + + +
+ + + + + + + Q
+ + + + + Q + +
+ + + Q + + + +
+ Q + + + + + +
+ + + + Q + + +
Solution #82:
+ + + + + + Q +
+ Q + + + + + +
+ + + Q + + + +
Q + + + + + + +
+ + + + + + + Q
+ + + + Q + + +
+ + Q + + + + +
+ + + + + Q + +
Solution #83:
+ + + + + + Q +
+ Q + + + + + +
+ + + + + Q + +
+ + Q + + + + +
Q + + + + + + +
+ + + Q + + + +
+ + + + + + + Q
+ + + + Q + + +
Solution #84:
+ + + + + + Q +
+ + Q + + + + +
Q + + + + + + +
+ + + + + Q + +
+ + + + + + + Q
+ + + + Q + + +
+ Q + + + + + +
+ + + Q + + + +
Solution #85:
+ + + + + + Q +
+ + Q + + + + +
+ + + + + + + Q
+ Q + + + + + +
+ + + + Q + + +
Q + + + + + + +
+ + + + + Q + +
+ + + Q + + + +
Solution #86:
+ + + + + + Q +
+ + + Q + + + +
+ Q + + + + + +
+ + + + Q + + +
+ + + + + + + Q
Q + + + + + + +
+ + Q + + + + +
+ + + + + Q + +
Solution #87:
+ + + + + + Q +
+ + + Q + + + +
+ Q + + + + + +
+ + + + + + + Q
+ + + + + Q + +
Q + + + + + + +
+ + Q + + + + +
+ + + + Q + + +
Solution #88:
+ + + + + + Q +
+ + + + Q + + +
+ + Q + + + + +
Q + + + + + + +
+ + + + + Q + +
+ + + + + + + Q
+ Q + + + + + +
+ + + Q + + + +
Solution #89:
+ + + + + + + Q
+ Q + + + + + +
+ + + Q + + + +
Q + + + + + + +
+ + + + + + Q +
+ + + + Q + + +
+ + Q + + + + +
+ + + + + Q + +
Solution #90:
+ + + + + + + Q
+ Q + + + + + +
+ + + + Q + + +
+ + Q + + + + +
Q + + + + + + +
+ + + + + + Q +
+ + + Q + + + +
+ + + + + Q + +
Solution #91:
+ + + + + + + Q
+ + Q + + + + +
Q + + + + + + +
+ + + + + Q + +
+ Q + + + + + +
+ + + + Q + + +
+ + + + + + Q +
+ + + Q + + + +
Solution #92:
+ + + + + + + Q
+ + + Q + + + +
Q + + + + + + +
+ + Q + + + + +
+ + + + + Q + +
+ Q + + + + + +
+ + + + + + Q +
+ + + + Q + + +