问题描述:在n*n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之在同一行或同一列或同一斜线上的棋子。n皇后问题等价于在n*n格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。
算法描述:描述语言为Java
import java.util.Scanner;
/**
* @author: Jarvenman
* @time: 2018年1月9日下午2:57:35
* @description: 回溯法解决n皇后问题
*/
public class NQueen {
public static int n; //皇后个数
public static int []x; //当前解序列,x[i]表示第i个皇后放在i行x[i]列
public static long sum; //当前已找到的可行方案数
public static long getAns(int num) {
n = num;
sum = 0;
x = new int [n+1];
//数组置零
for(int i=0; i<=n; i++) {
x[i] = 0;
}
backtrack(1);
return sum;
}
//查看k行的棋子如果摆放在x[k]列是否合法
public static boolean place(int k) {
for(int j=1; j<k; j++) {
//如果与之前的任何一个棋子摆在同列或对角线,则返回false
if(Math.abs(k-j)==Math.abs(x[j]-x[k]) || x[j] == x[k]) {
return false;
}
}
return true;
}
public static void backtrack(int t) {
if(t > n) {
//有了一个符合题意的摆放策略
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
if(j==x[i])
System.out.print("o");
else
System.out.print("*");
}
System.out.println();
}
System.out.println("--------------------------------------");
sum++;
} else {
for(int i=1; i<=n; i++) {
//查找第t行的摆放位置
x[t] = i;
if(place(t))
//如果摆放位置合法,则继续查找下一行
backtrack(t+1);
}
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
System.out.println(getAns(num));
}
}
测试运行: