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;
}

  

posted @ 2013-05-12 21:53  左懒  阅读(252)  评论(0编辑  收藏  举报