演算法-N皇后(遞迴)
阿新 • • 發佈:2019-02-09
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); } } } }
學到了一個小地方:
判斷是否在同一對角線上可以用“行座標差的絕對值==列座標差的絕對值”來判斷