C语言:最简单方法实现八皇后问题

八皇后问题(英文Eight queens),是由国际象棋棋手马克斯·贝瑟尔于1848年提出的问题

在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

思路分析:

1.先把第一个皇后放在第一行第一列;

2.将第二个皇后放在第二行第一列,判断是否可行,若不可行, 跳过本次循环,放到第二列判断,依次类推,找到合适位置;

3.继续放三皇后,还是从第一列、第二列......直到第八个皇后也能放在一个不冲突的位置,这样就找到了一个正确的解;

4.依次循环

该方法为循环嵌套方法,思路简单容易实现,但程序效率太低有待改进。

int main()
{
	int count = 0;
	for (int q1 = 0; q1 < 8; q1++) {
		{
			for (int q2 = 0; q2 < 8; q2++) {
				if (q1 == q2 || q2 + 1 == q1 || q2 - 1 == q1)
					continue;
				for (int q3 = 0; q3 < 8; q3++) {
					if (q3 == q1 || q3 + 2 == q1 || q3 - 2 == q1 ||
						q3 == q2 || q3 + 1 == q2 || q3 - 1 == q2)
						continue;
					for (int q4 = 0; q4 < 8; q4++) {
						if (q4 == q1 || q4 + 3 == q1 || q4 - 3 == q1 ||
							q4 == q2 || q4 + 2 == q2 || q4 - 2 == q2 ||
							q4 == q3 || q4 + 1 == q3 || q4 - 1 == q3)
							continue;
						for (int q5 = 0; q5 < 8; q5++) {
							if (q5 == q1 || q5 + 4 == q1 || q5 - 4 == q1 ||
								q5 == q2 || q5 + 3 == q2 || q5 - 3 == q2 ||
								q5 == q3 || q5 + 2 == q3 || q5 - 2 == q3 ||
								q5 == q4 || q5 + 1 == q4 || q5 - 1 == q4)
								continue;
							for (int q6 = 0; q6 < 8; q6++) {
								if (q6 == q1 || q6 + 5 == q1 || q6 - 5 == q1 ||
									q6 == q2 || q6 + 4 == q2 || q6 - 4 == q2 ||
									q6 == q3 || q6 + 3 == q3 || q6 - 3 == q3 ||
									q6 == q4 || q6 + 2 == q4 || q6 - 2 == q4 ||
									q6 == q5 || q6 + 1 == q5 || q6 - 1 == q5)
									continue;
								for (int q7 = 0; q7 < 8; q7++) {
									if (q7 == q1 || q7 + 6 == q1 || q7 - 6 == q1 ||
										q7 == q2 || q7 + 5 == q2 || q7 - 5 == q2 ||
										q7 == q3 || q7 + 4 == q3 || q7 - 4 == q3 ||
										q7 == q4 || q7 + 3 == q4 || q7 - 3 == q4 ||
										q7 == q5 || q7 + 2 == q5 || q7 - 2 == q5 ||
										q7 == q6 || q7 + 1 == q6 || q7 - 1 == q6)
										continue;
									for (int q8 = 0; q8 < 8; q8++) {
										if (q8 == q1 || q8 + 7 == q1 || q8 - 7 == q1 ||
											q8 == q2 || q8 + 6 == q2 || q8 - 6 == q2 ||
											q8 == q3 || q8 + 5 == q3 || q8 - 5 == q3 ||
											q8 == q4 || q8 + 4 == q4 || q8 - 4 == q4 ||
											q8 == q5 || q8 + 3 == q5 || q8 - 3 == q5 ||
											q8 == q6 || q8 + 2 == q6 || q8 - 2 == q6 ||
											q8 == q7 || q8 + 1 == q7 || q8 - 1 == q7)
											continue;
										count++;
										printf("%d,%d,%d,%d,%d,%d,%d,%d\n", q1, q2, q3,q4,q5,q6,q7,q8);
									}
								}
								}
							}
						}
					}
				}
			}
		}
	printf("%d\n", count);
	return 0;
	}

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值