数据结构与算法 --- 回溯算法

题目:八皇后问题
有一个 8x8 的棋盘,希望往里放 8 个棋子(皇后),每个棋子所在的行、列、对角线,都不能有另一个棋子。找到所有满足这种要求的放棋子方式
回溯的处理思想,有点类似枚举搜索。我们枚举所有的解,找到满足期望的解。为了有规律 地枚举所有可能的解,避免遗漏和重复,我们把问题求解的过程分为多个阶段。每个阶段, 我们都会面对一个岔路口,我们先随意选一条路走,当发现这条路走不通的时候(不符合期 望的解),就回退到上一个岔路口,另选一种走法继续走。
 
Java代码如下:
 
public class Test1 {
    /**
     *八皇后问题:
     * 有一个 8x8 的棋盘,希望往里放 8 个棋子(皇后),每个棋子所在的行、列、对角线
     * 都不能有另一个棋子。找到所有满足这种要求的放棋子方式
     */
    @Test
    public void test1(){
       cal8Queens(0);
    }


    int[]   result = new int[8]; //存储每个列的标号
    //递归实现算法
    public void cal8Queens(int row){
        if(row == 8){
            printArray(result);
            return;
        }
        for(int column=0;column<8;column++){
            if(isOk(row,column)){
                result[row] = column;
                cal8Queens(row+1);
            }
        }


    }
    //满足 8 皇后的规则要求
    public boolean isOk(int row,int column){
        int leftCl  = column-1;
        int rightCl = column+1;
        for(int i=row-1;i>=0;i--){

            if(result[i] == column)
                return false;
            if(leftCl>=0&&result[i] == leftCl){  //判断左上对角线是否满足无棋子的要求
                return false;
            }
            if(rightCl<8&&result[i] == rightCl){ //判断右上对角线是否满足无棋子的要求
                return false;
            }
            leftCl--;
            rightCl++;

        }

        return true;
    }

    public void printArray(int[] array){
        int row = 0;
        for(int a:array){
            System.out.println((row++)+","+a);
        }
        System.out.println("-------------------------------------");
    }
}

 

输出为每种可能 (只列出第一种排列方式,第一列为行号,第二列为列号)
 
0,0
1,4
2,7
3,5
4,2
5,6
6,1
7,3

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值