zoukankan      html  css  js  c++  java
  • 51. N-Queens

    一、题目

      1、审题

      2、分析:

        n-皇后问题: 一个 n X n的棋盘,其中,每一行、每一列、每一斜行、每一反斜行都不能有重复的皇后,输出所有的可能。

    二、解答

      1、思路:

        典型的回溯思想,运用 DFS 方法进行求解。其中:

        ①、斜行: [i-1][j-1]

        ②、 反斜行: [i-1][j+1]

    class Solution {
        public List<List<String>> solveNQueens(int n) {
            List<List<String>> resultList = new ArrayList<List<String>>();
            
            char[][] arr = new char[n][n];
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    arr[i][j] = '.'; 
                }
            }
            helper(resultList, arr, 0, n);
            return resultList;
        }
        
        private void helper(List<List<String>> resultList, char[][] arr, int row, int n) {
            // 典型的回溯格式(DFS)
            if(row == n) {
                List<String> list = new ArrayList<>();
                for(int i = 0; i < n; i++) {
                    list.add(String.valueOf(arr[i]));
                }
                resultList.add(list);
                return;
            }
            else {
                for(int col = 0; col != n; ++col) {
                    if(isValid(arr, row, col, n)) {
                        arr[row][col] = 'Q';
                        helper(resultList, arr, row+1, n);
                        arr[row][col] = '.'; 
                    }
                }
            }
            
        }
    
        public boolean isValid(char[][] arr, int row, int column, int n) {
            
            // check the column
            for (int i = 0; i != row; i++) {
                if(arr[i][column] == 'Q')
                    return false;
            }
            
            // check the 45 o
            for(int i = row - 1, j = column - 1; i >= 0 && j >= 0; --i, --j) {
                if(arr[i][j] == 'Q')
                    return false;
            }
            
            // check the 135 o
            for(int i = row -1, j = column + 1; i >= 0 && j < n; --i, ++j)
                if(arr[i][j]== 'Q' )
                    return false;
            
            return true;
        }
    }

        

  • 相关阅读:
    SecureCRT的设置和美化
    strtod-strtod, 字符串 转 数字 函数
    Debug : array type has incomplete element type
    Linux上Core Dump文件的形成和分析
    centos7,进程最大打开文件数 too many open files错误
    不使用临时变量交换两个值
    C语言的设计理念
    K&R C vs ANSI C(数据类型提升)
    再也不怕C语言的声明了
    K&R C vs ANSI C(数据类型转换)
  • 原文地址:https://www.cnblogs.com/skillking/p/9645433.html
Copyright © 2011-2022 走看看