本方法适合于刚开始接触c语言的同学。
问题描述:如图所示八皇后问题实在8x8的国际象棋棋盘上摆放8个皇后,使其不可相互攻击,也就是说任意两个皇后不可以在同一行、同一列、同一斜线上,问:有多少种摆法。
本题思路:通过上述可知每个皇后每一行有且只有一个皇后,所以先将第一个皇后在第一行循环八次,然后在这个循环内添加第二个皇后在第二行循环八次,也就是:
#include <stdio.h>
#include<math.h>
for (int i1 = 1; i1 <= 8 && 1 <= i1; i1++)
{
for (int i2 = 1; i2 <= 8 && 1 <= i2; i2++)
}
这时就得添加判断条件:这两个皇后如果在在同一行、同一列、同一斜线上,就跳过这个位置直接开始下一个位置 如下:
#include <stdio.h>
#include<math.h>
for (int i1 = 1; i1 <= 8 && 1 <= i1; i1++)
{
for (int i2 = 1; i2 <= 8 && 1 <= i2; i2++)
{
if (i1 == i2 || i1 == i2 + 1 || i1 == i2 - 1)
{
continue;
}
}
}
后边六个皇后也是如此循环下去,最后在第8个皇后循环内count++(统计共有多少种方法)并打印所有方法。
完整代码如下:
int main()
{
int count = 0;
for (int i1 = 1; i1 <= 8 && 1 <= i1; i1++)
{
for (int i2 = 1; i2 <= 8 && 1 <= i2; i2++)
{
if (i1 == i2 || i1 == i2 + 1 || i1 == i2 - 1)
{
continue;
}
for (int i3 = 1; i3 <= 8 && 1 <= i3; i3++)
{
if (i1 == i3 || i1 == i3 + 2 || i1 == i3 - 2 || i2==i3 || i2 == i3 + 1 || i2 == i3 - 1)
{
continue;
}
for (int i4 = 1; i4 <= 8 && 1 <= i4; i4++)
{
if (i1 == i4 || i1 == i4 + 3 || i1 == i4 - 3 || i2 == i4 || i2 == i4 + 2 || i2 == i4 - 2 || i3 == i4 || i3 == i4 + 1 || i3 == i4 - 1)
{
continue;
}
for (int i5 = 1; i5 <= 8 && 1 <= i5; i5++)
{
if (i1 == i5 || i1 == i5 + 4 || i1 == i5 - 4 || i2 == i5 || i2 == i5 + 3 || i2 == i5 - 3 || i3 == i5 || i3 == i5 + 2 || i3 == i5 - 2 || i4 == i5 || i4 == i5 + 1 || i4 == i5 - 1)
{
continue;
}
for (int i6 = 1; i6 <= 8 && 1 <= i6; i6++)
{
if (i1 == i6 || i1 == i6 + 5 || i1 == i6 - 5 || i2 == i6 || i2 == i6 + 4 || i2 == i6 - 4 || i3 == i6 || i3 == i6 + 3 || i3 == i6 - 3 || i4 == i6 || i4 == i6 + 2 || i4 == i6 - 2 || i5 == i6 || i5 == i6 + 1 || i5 == i6 - 1)
{
continue;
}
for (int i7 = 1; i7 <= 8 && 1 <= i7; i7++)
{
if (i1 == i7 || i1 == i7 + 6 || i1 == i7 - 6 || i2 == i7 || i2 == i7 + 5 || i2 == i7 - 5 || i3 == i7 + 4 || i3 == i7 - 4 || i3 == i7 || i4 == i7 || i4 == i7 + 3 || i4 == i7 - 3 || i5 == i7 || i5 == i7 + 2 || i5 == i7 - 2 || i6 == i7 || i6 == i7 + 1 || i6 == i7 - 1)
{
continue;
}
for (int i8 = 1; i8 <= 8 && 1 <= i8; i8++)
{
if (i1 == i8 || i1 == i8 + 7 || i1 == i8 - 7 || i2 == i8 || i2 == i8 + 6 || i2 == i8 - 6 || i3 == i8 || i3 == i8 + 5 || i3 == i8 - 5 || i4 == i8 || i4 == i8 + 4 || i4 == i8 - 4 || i5 == i8 || i5 == i8 + 3 || i5 == i8 - 3 || i6 == i8 || i6 == i8 + 2 || i6 == i8 - 2 || i7 == i8 || i7 == i8 + 1 || i7 == i8 - 1)
{
continue;
}
count++;
printf("%d,%d,%d,%d,%d,%d,%d,%d\n",i1,i2,i3,i4,i5,i6,i7,i8);
}
}
}
}
}
}
}
}
printf("%d\n",count);
return 0;
}
总结:此方法是适合于刚刚接触c语言的同学 ,可以通过本题熟练运用for循环,加油!代码的数量虽然看着很多但并不繁琐,很好理解,要有耐心哦!