N皇后 (25分)

N皇后 (25分)
在N*N的方格棋盤放置了N個皇后,使得它們不相互攻擊(即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。 你的任務是,對於給定的N,求出有多少種合法的放置方法

輸入格式:
共有若干行,每行一個正整數N≤10,表示棋盤和皇后的數量;

輸出格式:
共有若干行,每行一個正整數,表示對應輸入行的皇后的不同放置數量

輸入樣例:
在這裏給出一組輸入。例如:

1
8
5

輸出樣例:
在這裏給出相應的輸出。例如:

1
92
10

代碼如下:

方法一:

投機取巧法:手畫出前十個的排列,然後定義爲數組

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int[] x = {1,0,0,2,10,4,40,92,352,724};
		if(sc.hasNext()) {
			
			int n = sc.nextInt();
			System.out.println(x[n-1]);
		}
		
		sc.close();
		
	}
}

N皇后具體算法:

摘自百度百科

package PTA20191211;
public class NQueen {
    private int n;
    private long count;
    private int[] arr;
//    private int nn;

    public NQueen(int n){
        this.n = n;
  //      nn = (1 << n) - 1;
        count = 0;
        arr = new int[n];
    }


    /**
     * row col   i  arr[i]
     * @param row
     * @param col
     * @return
     */
    public boolean Check(int row, int col){
        for(int i = 0; i < row; i++){
            if(col == arr[i] || Math.abs(row - i) == Math.abs(col - arr[i])) //在同一列或者在同一斜線。一定不在同一行
                return false;
        }
        return true;
    }

    public void FindNQueen(int k) {
        if (k == n) {   //求出一種解, count+1
            count++;
            return;
        }

        for (int i = 0; i < n; i++) {
            if (Check(k, i)) {   //檢查是否滿足條件
                arr[k] = i;      //記錄
                FindNQueen(k + 1);   //遞歸查找
            }
        }

    }

    public static void main(String args[]){
        NQueen nQueen = new NQueen(10);
        nQueen.FindNQueen(0);
        System.out.println(nQueen.count);
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章