#include
#include
#include
#include
using namespace std;![
//定义一个队列
void NQueens();
//定义该皇后可以存在的位置
bool CanPos(int *pos, int level, int i);
//得到N在队列中的位置
int * GetNQueensPos(int n);
int main()
{
NQueens();
}
//该方法用于获取当前N皇后应该在哪个合适的位置
int * GetNQueensPos(int n)
{
//通过创建一个数组用于存放N皇后的大小
int *pos = new int[n];
//设置当前的行数默认为O
int level = 0;
//使用队列式保存N皇后在哪个行数和N皇后在行数的哪个具体位置
queue<int*> *QPos = new queue<int*>();
queue<int> *QLevel = new queue<int>();
while (true)
{
//N皇后的个数超过行数,则退出该循环
if (level == n)
{
break;
}
//通过for循环判断N皇后在哪行哪列合适
for (int i = 1; i <=n; ++i)
{
//N皇后在某个位置是否合适的结果判断出具体可以放的合适的位置
if (CanPos(pos, level, i))
{
//将第i个合适的皇后放置在指定的行数上
pos[level] = i;
//将合适的位置推进队列中
QPos->push(pos);
//将当前合适的行号推进队列中
QLevel->push(level + 1);
break;
}
}
//将当前的位置向前走一位
pos = QPos->front();
QPos->pop();
//将当前的行号向前走一位
level = QLevel->front();
QLevel->pop();
}
//返回该皇后合适的位置
return pos;
}
//该方法可以实现得到N皇后可以放置的位置是否合适
bool CanPos(int *pos, int level, int i)
{
//通过一个for循环判断N皇后是否不符合要求,符合则返回true,反之亦然
for (int j = 0; j < level; ++j)
{
if (abs(pos[j] - i) == abs(j - level) || (pos[j] == i))
{
return false;
}
}
return true;
}
//用于main方法调用并返回找到的合适的结果
void NQueens()
{
int n;
cout<<"请输入N皇后个数n:"<
cin>>n;
//通过循环的方式将符合条件的皇后位置输出来
int *pos = GetNQueensPos(n);
cout<<"N个皇后放置的情况如下:"<<endl;
for (int i = 0; i < n; ++i)
{
cout << pos[i] << " ";
}
cout << endl;
}
图片说明](https://img-ask.csdn.net/upload/201501/10/1420849365_69472.png)
详细错误是
****请输入N皇后个数n:
6
Process returned -1073741819 (0xC0000005) execution time : 5.289 s
Press any key to continue.****