N皇后问题是一个古老而经典的题目。该问题源自数学家高斯1850年提出八皇后问题:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
例如,在一个4x4的棋盘上,摆放4个皇后有两种方法,
用文本方式输出为
* Q * * * * * Q Q * * * * * Q * * * Q * Q * * * * * * Q * Q * *
我们可以用一维整数数组Q[]来表示N个皇后的摆放位置,例如,对4皇后问题的第一个解可以表示为,Q[0]=1,Q[1]=3,Q[2]=0,Q[3]=2。
当我们逐渐往棋盘上放置皇后时,用这种表示方法,可以做如下的判断来检查新放入的皇后的位置k是否可行:
1、如果Q[i]==Q[k],则有两个皇后在同一列,不可行;
2、如果Q[i]-Q[k]==(i-k),则有两个皇后在对角线上相互攻击,不可行;
3、如果Q[k]-Q[i]==(i-k),则有两个皇后在反对角线上相互攻击,不可行;
本题要求你按顺序输出N皇后问题的解。
输入:
棋盘的阶数N
输出:
对应的N皇后问题的解,请按照顺序输出。顺序可参考后面给出的参考解答。
样例输入:
4
样例输出:
*□Q□*□*□↵
*□*□*□Q□↵
Q□*□*□*□↵
*□*□Q□*□↵
↵
*□*□Q□*□↵
Q□*□*□*□↵
*□*□*□Q□↵
*□Q□*□*□↵
import java.util.*;
/*
*
*/
public class Main {
public static boolean isQueen(int [] queen,int n,int m)
{
for (int i = 0; i < n; i++)
{
boolean isQueen = true;
for (int j = 0; j < m; j++)
{
if((queen[j]==i)||(i-queen[j]==m-j)||(queen[j]-i==m-j)){
isQueen = false;
break;
}
}
if(isQueen){
queen[m]=i;
if(m<n-1){
if(isQueen(queen,n,m+1)){
printQueen(queen,n);
}
}else{
return true;
}
}
}
return false;
}
public static void printQueen(int []queen, int n)
{
for (int i = 0; i< n; i++)
{
for (int j = 0; j<n; j++)
{
if (queen[i]==j)
{
System.out.print("Q ");
}
else
{
System.out.print("* ");
}
}
System.out.println();
}
System.out.println();
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int [] queen = new int[n];
isQueen(queen,n,0);
}
}