题目描述:
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 N_Queens {
public static ArrayList<String[][]> solveNQueens(int n)
{
ArrayList<String[][]> result=new ArrayList<String[][]>();
String board[][]=new String[n][n];
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
board[i][j]=".";
}
}
solve(result,board,n,0);
return result;
}
public static void solve(ArrayList<String[][]> al,String board[][],int n,int line)
{
if(line==n)
{
String result[][]=new String[n][n];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
result[i][j]=board[i][j];
al.add(result);
}
else
{
//对每一行的每一列进行枚举
for(int i=0;i<n;i++)
{
if(check(board,n,line,i))
{
board[line][i]="Q";
}
else
{
continue;
}
solve(al,board,n,line+1);
board[line][i]=".";
}
}
}
public static boolean check(String board[][],int n,int line,int column)
{
for(int i=line-1;i>=0;i--)
{
if(board[i][column].equals("Q"))
{
return false;
}
}
for(int i=line-1,j=column-1;i>=0&&j>=0;i--,j--)
{
if(board[i][j].equals("Q"))
{
return false;
}
}
for(int i=line-1,j=column+1;i>=0&&j<n;i--,j++)
{
if(board[i][j].equals("Q"))
{
return false;
}
}
return true;
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
for(int i=0;i<solveNQueens(n).size();i++)
{
for(int j=0;j<solveNQueens(n).get(i).length;j++)
{
for(int k=0;k<solveNQueens(n).get(i).length;k++)
{
System.out.print(solveNQueens(n).get(i)[j][k]+" ");
}
System.out.println("\n");
}
System.out.println("+++++++++++++++++++++++++++++");
}
}
}