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

    The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.

    Given an integer n, return all distinct solutions to the n-queens puzzle.

    Each solution contains a distinct board configuration of the n-queens' placement, where 'Q' and '.' both indicate a queen and an empty space respectively.

    For example,
    There exist two distinct solutions to the 4-queens puzzle:

    [
     [".Q..",  // Solution 1
      "...Q",
      "Q...",
      "..Q."],
    
     ["..Q.",  // Solution 2
      "Q...",
      "...Q",
      ".Q.."]
    ]

    这种题目都是使用这个套路,就是用一个循环去枚举当前所有情况,然后把元素加入,递归,再把元素移除,这道题目中不用移除的原因是
    我们用一个一维数组去存皇后在对应行的哪一列,因为一行只能有一个皇后,如果二维数组,那么就需要把那一行那一列在递归结束后设回
    没有皇后,所以道理是一样的。
     1 public class Solution {
     2     public List<List<String>> solveNQueens(int n) {
     3         List<List<String>> ans = new ArrayList<List<String>>();
     4         recursive(ans,new int[n],0,n);
     5         return ans;
     6     }
     7     
     8     public void recursive(List<List<String>> ans,int[] columnForRow,int row,int n){
     9         if(row == n){
    10             List<String> tmp = new ArrayList<String>();
    11             for(int i = 0;i < n;i++){
    12                 StringBuilder sb = new StringBuilder();
    13                 for(int j = 0;j < n;j++){
    14                     if(columnForRow[i] == j)
    15                         sb.append("Q");
    16                     else 
    17                         sb.append(".");
    18                 }
    19                 tmp.add(sb.toString());
    20             }
    21             ans.add(tmp);
    22             return;
    23         }
    24         
    25         for(int i = 0; i < n; i++){
    26             columnForRow[row] = i;
    27             if(check(columnForRow,row)){
    28                 recursive(ans,columnForRow,row+1,n);//递归回溯
    29             }
    30         }
    31     }
    32     
    33     public boolean check(int[] columnForRow, int row){
    34         for(int i = 0; i < row; i++){
    35             if(columnForRow[row] == columnForRow[i] || row-i == Math.abs(columnForRow[row] - columnForRow[i]))
    36                 return false;//检查其他行有列相同或者,对角线有没有元素就是行差和列差不要相同
    37         }
    38         return true;
    39     }
    40 }
  • 相关阅读:
    react Native 运行报错之一 gradle-2.14.1-all解压失败的问题
    react native windows create bundle folder
    gulp+browserSync+nodemon 实现express 全端自动刷新的实践
    nodejs框架express4.x 学习--安装篇
    转: angularjs 指令中动态编译的方法(适用于有异步请求的情况) 内嵌指令无效
    angular 基础练习
    自己写的数组排重+排序
    前端开发bower包管理器
    定位网站性能的一些经验
    记一次大规模数据迁移和加密
  • 原文地址:https://www.cnblogs.com/guoguolan/p/5623093.html
Copyright © 2011-2022 走看看