首页 > 代码库 > leetcode--N-Queens

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


dfs method.

public class Solution {    public List<String[]> solveNQueens(int n) {        List<String[]> placement = new ArrayList<String[]>();		if(n == 1){			placement.add(new String[]{"Q"});	        return placement;	    }		if(n >= 4){			List<Integer> position = new ArrayList<Integer>();			dfs(n, 0, position, placement);		}		return placement;		}			private boolean dfs(int n, int row, List<Integer> position, List<String[]> placement){		if(row == n) return true; 		for(int i = 0; i < n; ++i) {			if(isValidPosition(row * n + i, position, n)){				position.add(row * n + i);				if(dfs(n, row + 1, position, placement))					generateSolution(position,placement, n);				position.remove(row);			}		}		return false;	}			private boolean isValidPosition(int k, List<Integer> position, int n){		for(int i = 0; i < position.size(); ++i){			int alreadyAdded = position.get(i);			if(k % n == alreadyAdded % n) // on the same column				return false;			int row = alreadyAdded / n, currentRow = k / n;			if((k % n == alreadyAdded % n - currentRow + row)||(k % n == alreadyAdded % n + currentRow - row)) //skew positions				return false;		}		return true;	}			private void generateSolution(List<Integer> position, List<String[]> placement, int n){		char[] oneRow = new char[n];		for(int i = 0; i < n; ++i)			oneRow[i] = ‘.‘;		String[] oneSolution = new String[n];		for(int i = 0; i < n; ++i){			oneRow[position.get(i) % n] = ‘Q‘;			oneSolution[i] = new String(oneRow);			oneRow[position.get(i) % n] = ‘.‘;		}		placement.add(oneSolution);            }}