1-C语言 8皇后问题 (For循环解法)

本方法适合于刚开始接触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循环,加油!代码的数量虽然看着很多但并不繁琐,很好理解,要有耐心哦!

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨尔翔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值