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

Posted jiangwangxiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构与算法 -- 回溯算法相关的知识,希望对你有一定的参考价值。

1、八皇后问题

//8皇后问题--回溯算法
public class Recall 
    int[] result = new int[8];//全局或成员变量,下标表示行,值表示queue存储在哪一列
    
    public static void main(String[] args) 
        Recall recall = new Recall();
        recall.cal8queues(0);
    
    
    public void cal8queues(int row) //调用方式:cal8queues(0)
        if(row == 8) //8个棋子都放置好了,打印结果
            printQueues(result);
            return;//8行棋子都放好了,已经没法再往下递归了,所以就return
        
        for(int column=0; column<8; column++) //每一行都有8种放法
            if(isOk(row, column)) //有些放法不满足要求
                result[row] = column;//第row行的棋子放到了column列
                cal8queues(row+1);//考察下一行
            
        
    
    
    private boolean isOk(int row, int column) //判断row行column列放置是否合适
        int leftup = column-1, rightup = column+1;
        for(int i=row-1; i>=0; i--) //逐行往上考察每一行
            if(result[i] == column) 
                return false;//第i行的column列有棋子吗?
            
            if(leftup >= 0) //考察左上对角线:第i行leftup列有棋子吗?
                if(result[i] == leftup) 
                    return false;
                
            
            if(rightup < 8) //考察右上对角线:第i行rightup列有棋子吗?
                if(result[i] == rightup) 
                    return false;
                
            
            leftup--;
            rightup++;
        
        return true;
    
    private void printQueues(int[] result) //打印一个二维矩阵
        for(int row=0; row<8; row++) 
            for(int column=0; column<8; column++) 
                if(result[row] == column) 
                    System.out.print("Q");
                else 
                    System.out.print("*");
                
            
            System.out.println();
        
        System.out.println();
    

 

以上是关于数据结构与算法 -- 回溯算法的主要内容,如果未能解决你的问题,请参考以下文章

一文通数据结构与算法之——回溯算法+常见题型与解题策略+Leetcode经典题

回溯法 - 数据结构与算法

数据结构与算法同种算法分别用递归/回溯与栈实现

#yyds干货盘点#数据结构与算法-暴力递归与回溯

数据结构&算法-回溯算法& 贪心算法

数据结构&算法-回溯算法& 贪心算法