回溯法解决N皇后问题

/*
* 使用回溯法解决n皇后问题
*/
#include <stdio.h>
#include <math.h>

#define NUM 8 //皇后的数目
int chess[NUM]; //依次表示每个皇后所在的列数
int count = 0;//总的解数 

//表示能否在第i行value列放置皇后,行数是从0开始
bool canPlaced(int i,int value)
{
	//第0行的皇后可以任意摆放
	if (i==0)
	{
		return 1;
	}
	//依次检测之前的皇后,是否冲突
	for (int j=0;j<i;j++)
	{
		//列冲突
		if (chess[j]==value)
		{
			return false;
		}

		//对角线冲突
		if (abs(i-j)==abs(chess[j]-value))
		{
			return false;
		}
	}
	return true;
}

//打印出结果
void showResult()
{
	int k;
	for (int j=0;j<NUM;j++)
	{
		for (k=0;k<chess[j];k++)
		{
			printf("*");
		}

		printf("Q");

		for (k=k+1;k<NUM;k++)
		{
			printf("*");
		}
		printf("\n");
	}
	printf("\n");
}

//采用递归回溯法
void backTrack(int t)
{
	int i;
	//皇后数目超出棋盘,摆放完毕
	if (t>=NUM)
	{
		printf("\n");
		showResult();
		count++;
		return;
	}
	else
	{
		//依次检测能否摆放
		for (i=0;i<NUM;i++)
		{
			if (canPlaced(t,i))
			{
				chess[t] = i;
				//若能够摆放,则摆放下一个
				backTrack(t+1);
			}
		}
	}
}


int main()
{
	backTrack(0);
	showResult();
	printf("%d皇后问题共有%d个解\n",NUM,count);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值