8皇后问题的条件我也不多说,相信大家都知道要满足的条件才搜的。
接下来就直接放上我的代码,第一次发这个,见谅。如果要改成n皇后的话把代码里的某些边界数换掉就好了
#include<iostream>
using namespace std;
//n为你想要得到的第n次成功摆放 m记录当前摆放成功序号 j为皇后在第几列操作
void fun(int a[8][8], int &m, int n, int j)
{
for (int i = 0; i < 8; i++)
{
int k;
//判断左上斜线
for (k = 1; i - k >= 0 && j - k >=0; k++)
{
if (a[i - k][j - k] == 1)
{
break;
}
}
if (i - k >= 0 && j - k >= 0)
{
a[i][j] = 0;
continue;
}
//判断左下斜线
for (k = 1; i + k <= 7 && j - k >= 0; k++)
{
if (a[i + k][j - k] == 1)
{
break;
}
}
if (i + k <= 7 && j - k >= 0)
{
a[i][j] = 0;
continue;
}
//判断正左
for (k = 1; j - k >= 0; k++)
{
if (a[i][j - k] == 1)
{
break;
}
}
if (j - k >= 0)
{
a[i][j] = 0;
continue;
}
//此位置安全
else
{
a[i][j] = 1;
//如果为最后一列则为一次成功案例 序号m则加一
if (j == 7)
{
m++;
//如果该成功序号和你想要得到的序号一样 则直接返回
if (m == n)
{
return;
}
else
{
a[i][j] = 0;
return;
}
}
//如果不是最后一列则进入下一列摆放
else
{
fun(a, m, n, j + 1);
//每次从更深一层返回出来时都要进行判断
if (m == n)
return;
else
{
a[i][j] = 0;
}
}
}
}
}
int main()
{
int a[8][8] = { 0 };
int m, n;
int count;
cin >> count; //该数用作判断你想得到几次8皇后摆放答案
while (count--)
{
m = 0;
//重置棋盘
for (int i = 0; i < 8; i++)
for (int j = 0; j < 8; j++)
a[i][j] = 0;
int j = 0;
cin >> n; //第n次正确排法
//每次都从8*8棋盘都是0开始
fun(a, m, n, j);
for (int i = 0; i < 8; i++)
{
for (j = 0; j < 8; j++)
{
cout << a[i][j] << " ";
}
cout << endl;
}
}
system("pause");
}