八皇后算法(回溯)

八皇后问题是一个经典的回溯法应用实例,要求在8x8棋盘上放置8个皇后,使得任何两个皇后不能在同一行、列或对角线上。本文介绍了问题背景、算法思路,并提供了相关代码实现。

算法描述: 八皇后是一道很具典型性的题目。它的基本要求是这样的:在一个8*8的矩阵上面放置8个物体,一个矩阵点只允许放置一个物体,任意两个点不能在一行上,也不能在一列上,不能在一条左斜线上, 当然也不能在一条右斜线上。

八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种方法可以解决此问题。

算法分析:数组left,right,col分别用来标记冲突,

    col数组代表列冲突,从col[0]~col[7]代表第0列到第7列,如果某列上已经有皇后,则为1,否则为0;

  right数组代表主对角线冲突,为right[i-j+7],即从right[0]~right[14],如果某条主对角线上已经有皇后,则为1,否则为0;

  数组left代表从对角线冲突,为left[i+j],即从left[0]~left[14],如果某条从对角线上已经有皇后,则为1,否则为0;

1.初始化

int col[8]={0};
int left[15]={0};
int right[15]={0};
int Q[8];//皇后
int cnt=0;//计数器

2.输出函数

void Printf(){
	int a[8][8]={0};
	for(int k=0;k<8;++k){
		a[k][Q[k]]=1;
	}
	for(int k=0;k<8;++k){
		for(int m=0;m<8;++m){
			printf("%2d",a[k][m]);
		}
		printf("\n");
	}
	printf("\n\n");
}

3.Queue函数

void Queen
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值