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.."] ]
public class Solution { public List<String[]> solveNQueens(int n) { ArrayList<String[]> result=new ArrayList<String[]>(); Integer []columns=new Integer[n]; placeQueens(0,n,columns,result); return result; } //dfs public void placeQueens(int row,int n,Integer[] columns,ArrayList<String[]> result){ if(row==n){ String[] arr=new String[n]; for(int i=0;i<n;i++){ StringBuffer sb=new StringBuffer(); for(int j=0;j<n;j++){ if(columns[i]==j) sb.append("Q"); else sb.append("."); } arr[i]=sb.toString(); } result.add(arr); } else { for(int col=0;col<n;col++){ if(isValid(columns,row,col)){ columns[row]=col; placeQueens(row+1,n,columns,result); } } } } public boolean isValid(Integer[] columns,int row1,int column1){ for(int row2=0;row2<row1;row2++){ int column2=columns[row2]; //check column if(column1==column2) return false; //check duijiaoxian int colDistance=Math.abs(column1-column2); int rowDistance=row1-row2; if(colDistance==rowDistance) return false; } return true; } }
原文地址:http://blog.csdn.net/dutsoft/article/details/38656187