八皇后
思路
从第一行开始搜,每次搜到 i 行后遍历每一列。然后判断该列、左右两个斜线(分别为横纵坐标相加相等 和 横纵坐标相减相等)是否存在棋子,如果不存在则数组记录每列的数据,进行下一行搜素。最后搜完再取消标记。
import java.util.Scanner;
public class Main {
static int[] ans = new int[50];
static boolean[] fcol = new boolean[50]; //列判断
static boolean[] frl = new boolean[50]; //右斜判断
static boolean[] fll = new boolean[50]; //左斜判断
static int sum = 0;
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();
getAns(n, 1); //从第一行开始
System.out.println(sum);
}
private static void getAns(int n, int i) {
if(i > n) {
sum ++;
if(sum <= 3) {
for(int j=1; j<n; j++)
System.out.print(ans[j]+" ");
System.out.println(ans[n]);
}
}else {
for(int j=1; j<=n; j++) { //遍历每列
if(!fcol[j] && !frl[i-j+n] && !fll[i+j]) {
fcol[j] = true;
frl[i-j+n] = true;
fll[i+j] = true;
ans[i] = j; //放入第 i 行第 j 列
getAns(n, i+1);
fcol[j] = false;
frl[i-j+n] = false;
fll[i+j] = false;
}
}
}
}
}