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