leetcode -- N-Queens

9377 단어 LeetCode
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 static void main(String[] args) {

 3         ArrayList<String[]> result = solveNQueens(4);

 4         System.out.println(result.size());

 5         for(int i = 0; i < result.size(); i++){

 6             System.out.println("solution:" + i);

 7             for(int j = 0; j < result.get(i).length; j++){

 8                 System.out.println(result.get(i)[j]);

 9             }

10         }

11     }

12 

13     public static ArrayList<String[]> solveNQueens(int n) {

14         // Start typing your Java solution below

15         // DO NOT write main() function

16         ArrayList<String[]> result = new ArrayList<String[]>();

17         int depth = 0;

18         int[] rows = new int[n];

19         for (int i = 0; i < n; i++) {

20             rows[i] = n + 1;

21         }

22         dfs(depth, rows, n, result);

23         return result;

24     }

25 

26     public static void dfs(int depth, int[] rows, int n, ArrayList<String[]> result) {

27         if (depth == n) {

28             String[] s = new String[n];

29             for (int i = 0; i < n; i++) {

30                 int m = rows[i];

31                 StringBuilder tmp = new StringBuilder();

32                 for (int j = 0; j < n; j++) {

33                     if (j == m) {

34                         tmp.append("Q");

35                         continue;

36                     }

37                     tmp.append(".");

38                 }

39                 s[i] = tmp.toString();

40             }

41             result.add(s);

42             return;

43         }

44         for (int i = 0; i < n; i++) {

45             rows[depth] = i;

46             if (isValid(rows, depth)) {

47                 dfs(depth + 1, rows, n, result);

48             }

49         }

50 

51     }

52     public static boolean isValid(int[] rows, int depth) {

53         for (int i = 0; i < depth; i++) {

54             if (rows[i] == rows[depth]

55                     || Math.abs(rows[i] - rows[depth]) == Math.abs(i - depth)) {

56                 return false;

57             }

58         }

59         return true;

60     }

61 }

좋은 웹페이지 즐겨찾기