N皇后问题
问题描述:
八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。
单一解法思路:
判断当行是否有位置能摆放,如果能够摆放则往下一行摆放。如果当前行无法摆放,则回溯到上一行的下一列位置进行摆放。如此循环知道得到解。
/**************************************************************************** * * * N皇后求解 * * 测试环境: VS2012 Windows7 * * * * By:左懒 * ****************************************************************************/ #include <iostream> using namespace std; #define N 20 //N皇后 int board[N][N] = {0}; typedef struct { int row; int col; }point; void out() { for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if ( board[i][j] == 0 ) cout << "□"; else if ( board[i][j] == 1 ) cout << "■"; } cout << endl; } cout << endl; } bool isPlace(int row, int col) { for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { //不能同行存放 if ( i == row && board[row][j] ) return false; //不能同列存放 if ( j == col && board[i][col] ) return false; //不能斜放 if ( (i+j == row+col) && board[i][j] ) return false; //不能反斜放 if ( (i-j == row-col) && board[i][j] ) return false; } } return true; } void queen() { point stack[100] = {0}; int top = -1; int row = 0, col = 0; while (row < N) { while (col < N) { if ( isPlace (row, col) ) { stack[++top].row = row; stack[top].col = col; board[row][col] = 1; break; } col++; } if (N == col) //当前行若是不能存放则回溯 { row = stack[top].row; col = stack[top--].col; board[row][col] = 0; col++; } else { row++; col = 0; } } } int main (void) { queen(); out(); return 0; }