C语言 递归——n皇后

递归

一个函数自己调用自己。
递归和普通函数调用一样都是用栈来实现的。

递归的作用

  1. 代替多重循环
  2. 将问题分解为规模更小的子问题再求解
  3. 解决本来就是用递归形式定义的问题

n皇后

题目

输入整数n,要求n个国际象棋的皇后,摆在n*n的棋盘上,互相不能攻击(使任意的两个皇后都不在同一行、同一列或同一条对角线上),输出全部方案。

代码

#include<stdio.h>
int N;		//N个皇后 
int queenPos[100];	// 皇后所摆位置,若第i个数为j,则表示第i个皇后摆在第i行第j列 
void Nqueen(int k)	//在前k-1行摆好的情况下,摆第k行及其后皇后,一行一个皇后 
{
	int i;
	if(k>N)	//N个皇后都摆好了 
	{
		for(i=1;i<=N;i++)	//输出N个皇后的摆放位置 
		{
			printf("%d ",queenPos[i]);
		}
		printf("\n");
		return ;
	} 
	for(i=1;i<=N;i++)	//将第k个皇后摆在第k行第i列 
	{
		int j;	//用来枚举前k-1行的皇后 
		for(j=1;j<k;j++)	//检查是否能与前k-1个皇后互相攻击 
		{
			if(i==queenPos[j]||i-queenPos[j]==k-j||i-queenPos[j]==j-k)
				break;	//能相互攻击则退出当前检测的循环,继续寻找合适的第k个皇后的位置 
		}
		if(j==k)	//当与前k-1个皇后不能互相攻击时 
		{
			queenPos[k]=i;	//将第k个皇后摆到第k行第i行 
			Nqueen(k+1);	//摆放下一个皇后 
		}
	}
}
int main()
{
	scanf("%d",&N); 
	Nqueen(1);	//摆放第i个皇后 
	return 0;
}

结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值