问题描述:
八皇后问题是一个以国际象棋为背景的问题:如何能够在 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;
}