您的位置:首页 > 其它

八皇后问题

2013-06-30 06:40 344 查看
八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。

#ifndef _ALGORITHM_H__
#define _ALGORITHM_H__

namespace Algorithm
{
class Queen // N皇后问题
{
private:
int RowNumber;  // 行数
int Count;      // 多少种解决方案
int *Array;     // 保存方案的结果
public:
Queen(int rowNumber);
void FindNext(int nextRow);   // 回溯
bool place(int row, int column);  // 是否可放置
int GetCount();    // 返回方案数
~Queen();
};
}
#endif


#include "Algorithm.h"
#include <iostream>
#include <iomanip>
using namespace std;
namespace Algorithm
{
Queen::Queen(int rowNumber)
{
RowNumber = rowNumber;
Count = 0;
Array = new int[RowNumber+1];
}
Queen::~Queen()
{
delete[] Array;
}

void Queen::FindNext(int nextRow)
{
if(nextRow > RowNumber)
{
Count++;
cout << "第" << Count << "方案如下:" << endl;
for(int i = 1; i <= RowNumber; i++)
{
for(int j = 1; j < Array[i]; j++)
cout << setw(2) <<" " ;
cout << setw(2) << Array[i] << endl;
}

}
else
{
for(int i = 1; i <= RowNumber; i++)
{
Array[nextRow] = i;
if(place(nextRow,i))
FindNext(nextRow+1);
}
}
}

bool Queen::place(int row, int column)
{
for(int i = 1; i < row; i++)
{
if(Array[row] == Array[i] || abs(row-i) == abs(Array[row] - Array[i]))
return false;
}
return true;
}

int Queen::GetCount()
{
return Count;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: