1、问题描述
有一个n×n 的国际象棋棋盘(n 行 n 列的方格图),请在棋盘中摆放 n 个受伤的国际象棋皇后,要求:
- 任何两个皇后不在同一行。
- 任何两个皇后不在同一列。
- 如果两个皇后在同一条 45 度角的斜线上,这两个皇后之间行号的差值至少为 3 。
请问一共有多少种摆放方案。
2、代码实现
import java.util.Scanner;
public class 受伤的皇后 {
static int n;
static int[] grid;
static int ans = 0;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
grid = new int[n];
dfs(0);
System.out.println(ans);
}
public static void dfs(int k) {
if(k == n) {
ans++;
return;
}
for(int i = 0;i < n;i++) {
grid[k] = i;
if(check(k)) {
dfs(k + 1);
}
}
}
public static boolean check(int k) {
for(int i = 0;i < k;i++) {
//是否在同一列,在同一斜线的情况下他们两个的间距必须大于等于3
if(grid[k] == grid[i] || Math.abs(k - i) == Math.abs(grid[k] - grid[i]) && Math.abs(k - i) < 3) {
return false;
}
}
return true;
}
}