八皇后问题(回溯)

[问题描述]

         皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

[解题思路]

      从第1行第1个开始,遍历8*8格,当发现当前点在同一行、同一列或同一斜线上有相同的点就不取该点,遍历到第八行,摆法就加1,然后就回溯。

[代码实现]

#include<stdio.h>

int ans[8] = {0}; /*存放棋子在每行的位置*/
int Count = 0;

void Print()
{
	for(int i = 0; i <8; i ++)
	{
		for(int j = 0; j < 8; j ++)
		{
			if(j==ans[i])
			{
				printf("# ");
				continue;
			}
			printf("* ");
		}	
		printf("\n");
	}
	printf("_____________________________________\n");
}

int IsRepeat(int new_i, int new_j)
{
	int j;
	for(int i= 0; i < new_i; i++)  
	{
		j = ans[i];
		if(new_j == j)       /*竖*/ 
			return 0;
		if((i + j) == (new_i + new_j))  /*右斜线*/
			return 0;
		if((i - j) == (new_i - new_j)) /*左斜线*/
			return 0;
	}
	return 1;
}

void dfs(int i) //i行 
{
	if(i==8)
	{
		Count ++; 
		Print();
		return ;
	}
	for(int j = 0; j < 8; j++) /*第i行的第几j个*/ 
	{
		if(IsRepeat(i, j))
		{
			ans[i] = j;
			dfs(i + 1);
			ans[i] = 0;
		}
	}
}

int main()
{
	dfs(0);
	printf("total = %d\n", Count);
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值