八皇后问题--递归调用

参考了算法竞赛入门经典那本书p125:


#include <stdio.h>
const int n=4;
int tol=0;
int arr[n];

//输出某个解
void print_res(int arr[],int n)
{
	for(int i=0; i<n; i++)
	{
		for(int j=0; j<n; j++)
		{
			if(arr[i]==j)
				printf("Q ");
			else
				printf("O ");
		}
		printf("\n");
	}
}

//递归求解所有解
//输入:cur-----代表当前处理的行号(从0开始计数,所以判断位置的时候已经保证了肯定不在同一行上)
void search_queen(int cur)
{
	if(cur==n)
	{
		tol++;
		//打印结果--必须在每次得到解后打印出来,否则后面的时候arr[]数组里边的内容就被覆盖了
		/*for (int t=0; t<n; t++)
		{
			printf("%d ",arr[t]);
		}
		printf("\n");*/
		printf("tol: %d\n",tol);
		print_res(arr,n);
		printf("\n");
		return ;
	}
	else
	{
		for(int j=0; j<n; j++)//遍历每一列的位置,选择合适的位置
		{
			int ok=1;
			arr[cur]=j;//试探第cur行的第j列的位置
			for (int m=0; m<cur; m++)//判断是否符合位置条件
			{
				if(arr[m]==j || m-cur==arr[m]-j || m-cur==j-arr[m])//是否同一列、是否同一个对角线、是否同一个副对角线
				{
					ok=0;
					break;//发现不符合条件,直接回溯,到cur行的下一个列的位置进行试探
				}
			}
			if(ok==1)
				search_queen(cur+1);//对下一行进行递归调用
		}
	}
}

int main()
{
	search_queen(0);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值