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);
}
}