1. 程式人生 > >演算法-N皇后(遞迴)

演算法-N皇后(遞迴)

package MOOC;
/**
 * 輸入整數n,要求n個國際皇后,擺在n*n的棋盤上,使其互相不能攻擊(不在同一行列對角線上),輸出全部方案
 */
import java.util.Scanner;

public class NQueen {
	static int n;
	static int[] queens;
	public static void main(String[] args) {
		Scanner input=new Scanner(System.in);
		n=input.nextInt();
		input.close();
		queens=new int[n];     //用來存放n個皇后的位置
		Queen(0);      //從第0行開始擺皇后
	}

	private static void Queen(int k) {     //在0到k-1行皇后已經擺好的情況下,擺第k行及其後邊的皇后
		int i;
		if(k==n) {      //n個皇后已經擺好
			for(i=0;i<n;i++) 
				System.out.print(queens[i]+1+" ");
			System.out.println();
			return;
		}
		for(i=0;i<n;i++) {     //列i,逐個嘗試第k個皇后的位置
			int j;
			for(j=0;j<k;j++) {     //遍歷之前行,如果迴圈結束,代表和之前存在的所有行都不衝突
				if(queens[j]==i||Math.abs(queens[j]-i)==Math.abs(k-j))    //和已經擺好的k個皇后的位置比較,看是否衝突:1.列i不能和之前行的一樣,2.行的差的絕對值和列的差的絕對值相同,代表在一條對角線上
					break;         //衝突,測試下一個位置
			}
			if(j==k) {   //當前選的位置i不衝突
				queens[k]=i;      //下標i作為第k個皇后的位置
				Queen(k+1);
			}
		}
		
	}

}

學到了一個小地方:

判斷是否在同一對角線上可以用“行座標差的絕對值==列座標差的絕對值”來判斷