八皇后回溯思考--java

记录一下对八皇后的思考
只列出主要的递归回溯代码
//摆皇后
    private void PutQueen(int n) {
        if(n==max) {
            Print();
            return;
        }
        for(int i=0;i<max;i++) {
            arr[n]=i;
            if(judge(n)) {
                PutQueen(n+1);
            }
        }
    }

//位置判断
	private boolean judge(int n) {
		for (int i = 0; i < n; i++) {
			if (arr[i] == arr[n] || Math.abs(n - i) == Math.abs(arr[i] - arr[n])) {
				return false;
			}
		}
		return true;

一维数组的index代表着每个皇后所在行;

现在放置第一个皇后(n=0),开始尝试[0,max)列;

先将第一个皇后放置在第0列(arr[0]=0);

判断第一个皇后是否与前0(n-1)个皇后产生问题(judge--判断是否同列,同一斜线);

不产生问题,放置第二个皇后;

此时进入PutQueen(n+1),n=0,i=0,i 还未进入i=1第二次循环,放置第一个皇后循环未结束,我们记录第一个皇后的列循环 i 为 i0;

i0 = 0,进入PutQueen(0+1),放置第二个皇后,第二个皇后开始尝试[0,max)列;

i1 = 0,arr[1] = 0 -->第二个皇后放在第0列;

判断与前1(n-1)个皇后是否产生问题;

第一个皇后在第0行0列,第二个现在在第1行第0列,产生问题;

judge(0+1)==false,不进入1+1第三个皇后的放置,继续第二个皇后的for循环,i1 = 1;

第二个皇后放置在第1行第1列,出问题,继续i1的循环;

这样一直放置放置,假设放x皇后的时候发现她在 [ 0,max ) 列都是与前(x-1)个皇后冲突。这个时候注意!!!前面每一次皇后都是摆着摆着,ix没有完整循环完就进入下一个皇后摆放的(参考前面写第一个皇后摆放的思路 [ i0=0就进入第二个皇后摆放了 ]);

所以这个时候就出现了回溯,第x个皇后每一列都与前面(x-1)皇后冲突,那么退到上一次第x-1个皇后当时的 ix-2(为什么是x-2不是x-1?因为我们设置的第一个皇后是 i0,第2个皇后是 i1) ,ix-2++,将第x-1个皇后往后一列放置;

如果这个时候第x-1个皇后与前面位置发生问题,继续往前回溯;

如果没有产生问题,则继续放置第x个皇后,并且重新考虑[0,max)列

听完课有点混混沌沌的,以上是自己对代码的思考

欢迎大家讨论

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值