void queen8(int n, int* C, int cur)
{
if (cur == n)
{
for (int i = 0; i < n; i++)
{
cout << C[i] << ",";
}
cout << endl;
}
else
{
for (int i = 0; i < n; i++)//每一层,尝试所有的列
{
int ok = 1;
//排除掉之前的元素的攻击范围
for (int j = 0; j < cur; j++)//之前出现过cur个元素,遍历
{
if (C[j] == i || (cur - j == abs(i - C[j])))//不一定满足条件,因为都与cur关联,与cur不关联的两个点貌似没有考虑?目前考虑cur的位置,之前的位置肯定都满足条件,所以只需要判断cur与之前的点是否在斜线上
{
ok = 0;
break;
}
}
if (ok)
{
C[cur] = i;//选择的结果保存在C中
queen8(n, C, cur + 1);//
}
}
}
}
int visit[2][2 * 8];
//保存过去所有节点,攻击的范围
//int visit[0] 出现的列
//int visit[1] 出现的主对角线 x-y+n 或者y-x+n 2*n
//int visit[2] 出现的副对角线 x+y 2*n
void queen8(int n, int* C, int cur)
{
if (cur == n)
{
for (int i = 0; i < n; i++)
{
cout << C[i] << ",";
}
cout << endl;
}
else
{
for (int i = 0; i < n; i++)//每一层,尝试所有的列
{
if (!visit[0][i] && !visit[1][i - cur + n] && !visit[2][i + cur])
{
C[cur] = i;
visit[0][i] = visit[1][i - cur + n] = visit[2][i+cur] = 1;
queen8(n, C, cur + 1);
visit[0][i] = visit[1][i - cur + n] = visit[2][i + cur] = 0;
}
}
}
}
#include <algorithm>
int main(int argc, const char* argv[])
{
//回溯法
//八皇后问题
//逐行 指定列数
//C[j] = i ; 第j行指定第i列
//每一行,遍历所有列尝试,逐行尝试
int C[8];
queen8(8, C, 0);