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); } }
leetcode--N-Queens,布布扣,bubuko.com
原文地址:http://www.cnblogs.com/averillzheng/p/3825843.html