package MOOC;
/**
* 输入整数n,要求n个国际皇后,摆在n*n的棋盘上,使其互相不能攻击(不在同一行列对角线上),输出全部方案
*/
import java.util.Scanner;
public class NQueen {
static int n;
static int[] queens;
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
n=input.nextInt();
input.close();
queens=new int[n]; //用来存放n个皇后的位置
Queen(0); //从第0行开始摆皇后
}
private static void Queen(int k) { //在0到k-1行皇后已经摆好的情况下,摆第k行及其后边的皇后
int i;
if(k==n) { //n个皇后已经摆好
for(i=0;i<n;i++)
System.out.print(queens[i]+1+" ");
System.out.println();
return;
}
for(i=0;i<n;i++) { //列i,逐个尝试第k个皇后的位置
int j;
for(j=0;j<k;j++) { //遍历之前行,如果循环结束,代表和之前存在的所有行都不冲突
if(queens[j]==i||Math.abs(queens[j]-i)==Math.abs(k-j)) //和已经摆好的k个皇后的位置比较,看是否冲突:1.列i不能和之前行的一样,2.行的差的绝对值和列的差的绝对值相同,代表在一条对角线上
break; //冲突,测试下一个位置
}
if(j==k) { //当前选的位置i不冲突
queens[k]=i; //下标i作为第k个皇后的位置
Queen(k+1);
}
}
}
}
学到了一个小地方:
判断是否在同一对角线上可以用“行坐标差的绝对值==列坐标差的绝对值”来判断