现在的位置: 首页 > 综合 > 正文

回溯法解决N皇后问题

2018年03月20日 ⁄ 综合 ⁄ 共 785字 ⁄ 字号 评论关闭
/*
* 使用回溯法解决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;
}

抱歉!评论已关闭.