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.Scanner; public class Main{ public static boolean Place(int Q[],int k) //考察皇后k放置在Q[k]列是否发生冲突 { for(int i=1; i<k; i++) { if (Q[i]==Q[k]||Q[i]-Q[k]==(i-k)||Q[k]-Q[i]==(i-k)) return false; } return true; } public static void Queen(int n) { int Q[]=new int[n+1]; for (int i=1; i<=n; i++)//初始化 Q[i]=0; int k=1; while (k>=1) { Q[k]=Q[k]+1;//在下一列放置第k个皇后 while (Q[k]<=n&&!Place(Q,k)) Q[k]=Q[k]+1;//如果不符合条件,搜索下一列 if (Q[k]<=n && k==n) { boolean[][] bl = new boolean[n][n]; for (int i=1; i<=n; i++){ bl[i-1][Q[i]-1]=true; } for(int l=1;l<=n;l++){ for(int c=1;c<=n;c++){ if(bl[l-1][c-1]==true) System.out.print("Q "); else System.out.print("* "); } System.out.println(); } System.out.println(); } else if (Q[k]<=n && k<n) k=k+1; //放置下一个皇后 else { Q[k]=0; //重置Q[k],回溯 k=k-1; } } } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); Queen(n); } }
附上论坛里最快的解法:http://www.iteye.com/topic/20059