N皇后

递归方法

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int q[100] = { 0 };
void Nqueen(int N, int K);
int num = 0;
int main()
{
	int N;
	scanf("%d", &N);
	Nqueen(N, 0);
	printf("%d", num);
}
void Nqueen(int N, int K)
{
	int j;
	if (K == N)
	{
		for (int i = 0; i < N; i++)
		{
			printf("%d ", q[i] + 1);
		}
		num++;
		printf("\n");
	}
	else
	{
		for (int i = 0; i < N; i++)
		{
			q[K] = i;//第K行位于第i列
			for (j = 0; j < K; j++)
			{
				if ((q[K]==q[j])||(abs(q[K]-q[j])==K-j))//与前K-1行不位于对角线上且不同列
				{
					break;
				}
			}
			if (j == K)
			{
				Nqueen(N, K + 1);
			}

		}
	}
}

非递归方法(只能解决N固定)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int q[4];
int Judge(int K, int J);//第K行放第J列
void Nqueen();
int main()
{
	Nqueen();
}
int Judge(int K,int J)//第K行放第J列
{
	for (int i = 0; i < K; i++)
	{
		if (abs(K - i) == abs(J - q[i]) || q[i] == J)
		{
			return 0;
		}
	}
	return 1;
}
void Nqueen()
{
	int a, b, c, d;
	{
		for (a = 0; a < 4; a++)
		{
			q[0] = a;
			for (b = 0; b < 4; b++)
			{
				if (Judge(1, b))
				{
					q[1] = b;
					for (c = 0; c < 4; c++)
					{
						if (Judge(2, c))
						{
							q[2] = c;
							for (d = 0; d < 4; d++)
							{
								if (Judge(3, d))
								{
									q[3] = d;
									for (int i = 0; i < 4; i++)
									{
										printf("%d ", q[i]+1);
									}
									printf("\n");
								}
							}
						}
					}
				}
			}
		}
	}
}

递归可以用来解决多重循环

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值