八皇后问题

问题描述:将八个皇后摆在一张8X8的国际象棋棋盘上,皇后可以吃掉其同一列、同一行或者同一条对角线上的皇后,那么使每个皇后都无法吃掉别的皇后,这样一共有多少种摆法?

算法思想:

这是经典的回溯算法的应用,8x8的棋盘我们可以按行或者按列确定皇后的位置,比如我这边是按行安排皇后的位置,那么堆栈里存放的则是其所在列数。

当放置一个新皇后时需要检测她是否会被之前放置的皇后吃掉,如果没有吃掉则记录所在列数并推入栈中。如果遍历这一行都不适合,则回溯到上一行重新放置上一个皇后,以此类推,把最后一个皇后都放置好。


代码实现:

网上有各种炫酷的方式能实现这个算法,下面介绍的可能就比较粗糙,但比较直观通俗。

设置的一些变量如下:

static int TRUE=1,FALSE=0,EIGHT=8;
	static int[] queen=new int[EIGHT];		//记录皇后的列数
	static int number=0;
attack 函数用来判断(row,col)这一位置是否与之前放置的皇后存在冲突,即是否会被之前的皇后吃掉,返回atk=TURE则表示会有冲突。
/*attatck函数
	 * 判断(row,col)位置是否符合要求
	 */
	public static int attack(int row,int col) {
		int i=0,atk=FALSE;
		int offsetRow=0,offsetCol=0;
		
		while((atk!=1)&&i<col) {
			offsetRow=Math.abs(queen[i]-row);
			offsetCol=Math.abs(i-col);
			
			//在同一列或者同一对角线则不符合要求
			if((queen[i])==row||offsetRow==offsetCol)
				atk=TRUE;
			i++;
		}
		return atk;
	}
	}

按行依次确定八个皇后所在列数

/*确定皇后的位置*/
	public static void decidePosition(int value) {
		int i=0;
		while(i<EIGHT) {
			if(attack(i,value)!=1) {
				queen[value]=i;
				if(value==7)
					printTable();		//八皇后位置均确定,打印输出位置
				else
					decidePosition(value+1);
			}
			
			i++;
		}
	}

输出结果如下,一共会有92种解,这个也算常识了。。

详细代码连接如下:点击打开链接

https://download.csdn.net/download/weixin_40447467/10303052

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值