Leetcode 51. N-Queens

来源:互联网 发布:win 10 网络初始化失败 编辑:程序博客网 时间:2024/05/17 09:32

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.."]]

这是经典N皇后,回溯遍历。N皇后问题比较复杂的部分就是判断部分,开始忘了斜线上不能重合的情况,后来加上了就对了。

public class Solution {    private boolean isRight(int[][] grid, int s, int t, int n){        for(int i=0; i< s; i++ ){            if(grid[i][t]==1){                return false;            }        }        for(int i=0; i< t; i++){            if(grid[s][i] ==1){                return false;            }        }        int i = s-1;        int j =t -1;        while(i>=0 && j>=0){            if(grid[i][j]==1){                return false;            }            i--;            j--;        }        i=s-1;        j=t+1;        while(i>=0 && j <n){            if(grid[i][j]==1){                return false;            }            i--;            j++;        }        return true;    }        private List<String> generateList(int[][] grid){         List<String> line = new ArrayList<String>();        for(int[] col : grid){            StringBuilder strBuilder = new StringBuilder();            for(int ele : col){                if(ele==1){                    strBuilder.append("Q");                }else{                    strBuilder.append(".");                }            }            line.add(strBuilder.toString());        }        return line;    }        private void itera(int k,int n, int[][] grid, List<List<String>> list){        if(k == n){            list.add(generateList(grid));            return ;        }        for(int i=0; i<n; i++){            if(isRight(grid, k, i, n)){                grid[k][i] =1;                itera(k+1, n, grid, list);                grid[k][i]=0;            }        }    }    public List<List<String>> solveNQueens(int n) {        int[][] grid =new int[n][n];        List<List<String>> list = new LinkedList<>();                if(n !=0){            itera(0, n, grid, list);        }               return list;            }}

时间复杂度O(N^2),  空间复杂度为O(N^2)。


0 0
原创粉丝点击