首页 > 编程语言 >N皇后 【回溯算法】

N皇后 【回溯算法】

时间:2022-09-20 20:36:12浏览次数:97  
标签:String List new char 算法 charList board 回溯 皇后

51. N 皇后 - 力扣(LeetCode)

 

核心:1.按照层去选择 2.使用String.copyValueOf(char[] ) 将char数组转成String

class Solution {
    List<List<String>>  res;
    public List<List<String>> solveNQueens(int n) {
        res = new ArrayList<>();
        // 初始化棋盘
        char[][] board = new char[n][n];
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                board[i][j] = '.';
            }
        }
        // 回溯
        traceBack(board,0);
        return res;
    }

    public void traceBack(char[][] board,int row){
        if(row == board.length){
            res.add(Array2List(board));
            return;
        }
        for(int col=0;col<board.length;col++){
            if(!isVaild(board,row,col)){
                continue;
            }
            // 选择
            board[row][col] = 'Q';
            // 下一层
            traceBack(board,row+1);
            // 撤销选择
            board[row][col] = '.';
        }
    }

    public boolean isVaild(char[][] board,int row,int col){
        // 1. 检查上方
        for(int i=0;i<row;i++){
            if(board[i][col] == 'Q') 
                return false;
        }
        // 2. 检查右上方
        for(int i=row-1,j=col+1;i>=0 && j<board.length;i--,j++){
            if(board[i][j] == 'Q')
                return false;
        }
        // 3. 检查左上方
        for(int i=row-1,j=col-1;i>=0 && j>=0;i--,j--){
            if(board[i][j] == 'Q')
                return false;
        }
        return true;
    }
    public List<String> Array2List(char[][] board){
        List<String> charList = new ArrayList<>();
        for(char[] c:board){
           charList.add(String.copyValueOf(c));
        }    
        return charList;
    }   
}

  

标签:String,List,new,char,算法,charList,board,回溯,皇后
From: https://www.cnblogs.com/jsuxk/p/16712373.html

相关文章

  • 3 垃圾收集算法
    目录1垃圾收集三件事2对象存活判定算法2.1引用计数算法2.2可达性分析算法2.2.1不可达对象的后置处理2.3方法区回收判定5垃圾收集算法介绍5.1分代收集理论5.1.1记......
  • 组合问题看透回溯法
    通过组合问题看透回溯法前言已经好久没有更新了......
  • 学习-从浏览器缓存淘汰策略和 Vue 的 keep-alive 学习 LRU 算法
    LRU(Leastfrequentlyused:最近最少使用)。算法在缓存写满的时候,会根据所有数据的访问记录,淘汰掉未来被访问几率最低的数据。也就是说该算法认为,最近被访问过的数据,在将来被......
  • MD5 到底是不是加密算法?
    在回答这个问题之前,我们先分别来了解一下两个知识点:什么是MD5算法?什么是加密算法?一、MD5算法MD5即Message-DigestAlgorithm5(信息-摘要算法5),用于确保信息传输完......
  • 全局唯一ID生成器(SnowFlakeId算法JAVA实现)
    importorg.apache.commons.lang3.RandomUtils;importjava.util.Random;/***@Description:全局唯一Id生成器*@Author:yk*@Create:2022-09-2016:55*/p......
  • 通关基本算法 day_04 -- 高精度
    高精度加法大整数如何存储? --每一位存到数组里例如:123456789 第0位存谁?--存9因为如果0位存最后一位,需要乘法的时候,在数组末尾添加数字要比数组开端添加数字方便......
  • 垃圾回收算法(3)-标记清除算法
    前言标记清除算法(Mark-Sweep)是一种非常基础和常见的垃圾收集算法,该算法被J.McCarthy等人在1960年提出并成功的发明并应用于Lisp语言。涉及概念先来了解一下mutator和col......
  • 垃圾回收算法(2)-根搜索算法
    前言相对于引用计数算法而言,根搜索算法不仅同样具备实现简单和执行高效等特点,更重要的是该算法可以有效的解决在引用记数法中一些已经死亡的对象因为相互引用而导致的无法......
  • 垃圾回收算法(1)-引用计数法
    算法原理引用记数法在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活的对象,哪些是已经死亡的对象,只有被标记为已经死亡的对象,GC才会在执行垃圾回收时,释放掉其所占用的......
  • Problem P19. [算法课贪婪]三角形的最大周长
    贪心:选三个最长的边组成三角形,如果最长的三个边不能组成,那么这时候无论把第二和第三大的边换成什么都不可能能够和最大的边组成三角形,这时候就必须把最大的边给换掉,把最......