N皇后问题
题目描述
N皇后问题是指在N*N的棋盘上要摆N个皇后,要求任何两个皇后不同行,不同列也不再同一条斜线上,求给一个整数n,返回n皇后的摆法。
输入描述:
输出一个整数,代表n(1≤n≤14)。
输出描述:
输出一个整数,代表n皇后的种数。
import java.util.Scanner;
public class NQueen{
public static int result(int n){
if(n < 1){
return 0 ;
}
//record记录每一行的皇后所属的列位置
//record数组索引值为行数,record数组存的值为列数
int[] record = new int[n] ;
return process1(0 , record , n) ;
}
/**
* 主方法,递归判断
* @param i
* @param record
* @param n
* @return
*/
public static int process1(int i , int[] record , int n){
if(i == n){
return 1 ;
}
//res记录数量
int res = 0 ;
for(int j=0 ; j<n ; j++){
//判断此位置是否可以放置皇后
if(isValiable(i , j , record)){
record[i] = j ;
res += process1(i+1 , record , n) ;
}
}
return res ;
}
/**
* 判断第i行第j列是否可以放置皇后
* @param i 当前行
* @param j 当前列
* @param record 数据
* @return
*/
public static boolean isValiable(int i , int j , int[] record){
//从第一行开始到当前行结束
for(int k=0 ; k<i ; k++){
//record[k] == j 同一列有没有皇后
//Math.abs(record[k] - j) == Math.abs(k - i) 对角线有没有皇后
if(record[k] == j || Math.abs(record[k] - j) == Math.abs(k - i)){
return false ;
}
}
return true ;
}
public static void main(String[] args){
Scanner input = new Scanner(System.in) ;
int n = input.nextInt() ;
System.out.println(result(n)) ;
}
}