C语言笔记--四皇后

四皇后是八皇后的衍生版本,其原理都是一样的。八皇后说的是在8×8的国际棋盘上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法?八皇后一共有92种解法。而四皇后是在一个4×4的棋盘上摆放4个皇后。

分析:

1.皇后是每行放置一个,所以每行是不会发生冲突的

2.判断位置是否安全依赖于该位置的列、副对角线、主对角线

3.如果遍历所有列数都找不到合适位置,即说明上一个皇后需要重新放置

关系如下:

#include<stdio.h>
#include<stdlib.h>
#define M 4
int queue[M] = { -1 };//用来保存4个皇后的列数
int count = 0;//方法总数
int issafe(int row, int column)//用于判断该位置是否安全
{
	for (int i = 0; i<row; i++)//遍历前面放置了皇后的行
	{
		if (queue[i] == column)return 0;//同一列不安全
		if ((row - i) == (column - queue[i]))return 0;//同一主对角线,行之差和列之差相等
		if ((row - i) + (column - queue[i])==0)return 0;//副对角线,行之差列之差的和为0
	}
	return 1;
}

void pickqueue(int num)
{
	for (int i = 0; i<M; i++)//遍历所有列数,找出能放的列
	{
		if (issafe(num, i))//判断当前皇后放在哪列式安全的
		{
			queue[num] = i;//保存当前列数
			if (num == 3)//满4个皇后
			{
				count++;
				for (int j = 0; j < M; j++)
				{
					printf("%3d", queue[j]);
				}
				printf("\n");
			}	
			int next = num + 1;
			pickqueue(next);//下一个皇后
		}
	}
	//遍历完所有列数后都找不到位置,即说明上一个皇后需要重新放置
	if (num==0)//若到退到0列都找不到合适位置,即返回
	{
		return;
	}
	else
	{
		queue[--num]=-1;//上一个皇后列数清除
	}
}
void main()
{
	pickqueue(0);//第一个皇后
	printf("总数为:%d", count);
	system("pause");
}

八皇后是一样的,只需把皇后数改为8。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值