zoukankan      html  css  js  c++  java
  • Leetcode-N-Queens

    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.."]
    ]
    
    Have you met this question in a real interview?
     
    Analysis:
    How to determine whether the current position at jth row is valid? Suppose jth row position is place[j] and ith row position is place[i]. Then we found that place[i] leads three positions at jth row invalid. They are place[i], place[i]+j-i, place[i]-(j-i).
     
    Solution:
     1 public class Solution {
     2     public List<String[]> solveNQueens(int n) {
     3         List<String[]> res = new ArrayList<String[]>();
     4         int[] place = new int[n];
     5         Arrays.fill(place,-1);
     6         int level = 0;
     7   
     8         while (level!=-1){
     9             if (level>=n){
    10                 constructRes(place,res,n);
    11                 level--;
    12                 continue;
    13             }
    14 
    15             int val = place[level];
    16             val++;
    17             while (val<n){
    18                 boolean valid = true;
    19                 for (int i=0;i<level;i++)
    20                     if (val==place[i] || val==place[i]+level-i || val==place[i]-(level-i)){
    21                         valid = false;
    22                         break;
    23                     }
    24                 if (valid) break;
    25                 else val++;
    26             }
    27 
    28             if (val<n){
    29                 place[level]=val;
    30                 level++;
    31             } else {
    32                 place[level]=-1;
    33                 level--;
    34             }
    35         }
    36 
    37         return res;
    38         
    39     }
    40 
    41     public void constructRes(int[] place, List<String[]> res, int n){
    42         char[] line = new char[n];
    43         Arrays.fill(line,'.');
    44         String[] oneRes = new String[n];
    45         for (int i=0;i<n;i++){
    46             int val = place[i];
    47             line[val]='Q';
    48             String lineStr = new String(line);
    49             line[val]='.';
    50             oneRes[i]=lineStr;
    51         }
    52         res.add(oneRes);
    53     }       
    54 }
     
     
  • 相关阅读:
    电路开发软件积累
    .NET移动开发环境搭建
    Microsoft SQL Server Express各版本对比
    .NET IL指令速查表
    C#访问加密的SQLite数据库
    C#中时间计算方法汇总
    最佳C/C++编辑器 source insight3
    常用PHP框架收集
    CSS 中文字体的英文名称 (simhei, simsun) 宋体 微软雅黑等
    Windows下Java JDK8配置环境变量
  • 原文地址:https://www.cnblogs.com/lishiblog/p/4125302.html
Copyright © 2011-2022 走看看