八个皇后 , 分布在八行八列 , 任意两个皇后不能在同一行 ( 每一行一定有一个皇后 ), 任意两个皇后不能 在同一列, 任意两个皇后不能成 45 度或 135 度 , 统计所有皇后能存放的位置和总数
PS:这篇文章想法思路简单,代码量长,适合初学者学习,能更好的的理解这个问题
先定义计数器
int count=o//计数器
我们先摆放第一个皇后,再摆放第二个皇后的时候需要考虑
皇后与皇后不会再同一行上,不会在直角线上(成45°或135°)(定义的一维数组已经保证每一行只会有一个皇后)。所以我们在每摆放一个新的皇后时都要与前面的皇后进行if语句的判断
for (int q1 = 0; q1 < 8; q1++) //第一个皇后
{
for (int q2 = 0; q2 < 8; q2++) //第二个皇后
{
if (q1 == q2 || q1 == q2 + 1 || q1 == q2 - 1) //不在同一列,不成对角线
{
continue;
}
}
}
同理继续判断,完整代码如下
int main()
{
int count = 0;//计数器
for (int q1 = 0; q1 < 8; q1++)
{
for (int q2 = 0; q2 < 8; q2++)
{
if (q1 == q2 || q1 == q2 + 1 || q1 == q2 - 1)
{
continue;
}
for (int q3 = 0; q3 < 8; q3++)
{
if (q1 == q3 || q1 == q3 + 2 || q1 == q3 - 2
|| q2 == q3 || q2 == q3 + 1 || q2 == q3 - 1)
{
continue;
}
for (int q4 = 0; q4 < 8; q4++)
{
if (q1 == q4 || q1 == q4 + 3 || q1 == q4 - 3
|| q2 == q4 || q2 == q4 + 2 || q2 == q4 - 2
|| q3 == q4 || q3 == q4 + 1 || q3 == q4 - 1)
{
continue;
}
for (int q5 = 0; q5 < 8; q5++)
{
if (q1 == q5 || q1 == q5 + 4 || q1 == q5 - 4
|| q2 == q5 || q2 == q5 + 3 || q2 == q5 - 3
|| q3 == q5 || q3 == q5 + 2 || q3 == q5 - 2
|| q4 == q5 || q4 == q5 + 1 || q4 == q5 - 1)
{
continue;
}
for (int q6 = 0; q6 < 8; q6++)
{
if (q1 == q6 || q1 == q6 + 5 || q1 == q6 - 5
|| q2 == q6 || q2 == q6 + 4 || q2 == q6 - 4
|| q3 == q6 || q3 == q6 + 3 || q3 == q6 - 3
|| q4 == q6 || q4 == q6 + 2 || q4 == q6 - 2
|| q5 == q6 || q5 == q6 + 1 || q5 == q6 - 1)
{
continue;
}
for (int q7 = 0; q7 < 8; q7++)
{
if (q1 == q7 || q1 == q7 + 6 || q1 == q7 - 6
|| q2 == q7 || q2 == q7 + 5 || q2 == q7 - 5
|| q3 == q7 || q3 == q7 + 4 || q3 == q7 - 4
|| q4 == q7 || q4 == q7 + 3 || q4 == q7 - 3
|| q5 == q7 || q5 == q7 + 2 || q5 == q7 - 2
|| q6 == q7 || q6 == q7 + 1 || q6 == q7 - 1)
{
continue;
}
for (int q8 = 0; q8 < 8; q8++)
{
if (q1 == q8 || q1 == q8 + 7 || q1 == q8 - 7
|| q2 == q8 || q2 == q8 + 6 || q2 == q8 - 6
|| q3 == q8 || q3 == q8 + 5 || q3 == q8 - 5
|| q4 == q8 || q4 == q8 + 4 || q4 == q8 - 4
|| q5 == q8 || q5 == q8 + 3 || q5 == q8 - 3
|| q6 == q8 || q6 == q8 + 2 || q6 == q8 - 2
|| q7 == q8 || q7 == q8 + 1 || q7 == q8 - 1)
{
continue;
}
count++;
printf("%d,%d,%d,%d,%d,%d,%d,%d\n", q1, q2, q3, q4, q5, q6, q7, q8);
}
}
}
}
}
}
}
}
printf("一共有%d种方法", count);
return 0;
}