题目描述
有一个 n \times nn×n 的国际象棋棋盘(nn 行 nn 列的方格图),请在棋盘中摆放 nn 个受伤的国际象棋皇后,要求:
- 任何两个皇后不在同一行。
- 任何两个皇后不在同一列。
- 如果两个皇后在同一条 45 度角的斜线上,这两个皇后之间行号的差值至少为 3 。
请问一共有多少种摆放方案。
输入描述
输入的第一行包含一个整数 nn。
其中,1 \leq n \leq 101≤n≤10。
输出描述
输出一个整数,表示答案。
输入输出样例
示例 1
输入
4
输出
2
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
解法
public static int n;
public static int sum = 0;
public static int[] arr;
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
n = scan.nextInt();
arr = new int[n+1];//每一行表示一个皇后,这样可以巧妙避免两个皇后在同一行的情况。
lay(1);
System.out.println(sum);
scan.close();
}
//index:表示第index个皇后。
//seat:表示某行第seat这个位置。
//check(int index, int seat):检查第index个皇后能否坐在第index行第seat这个位置。
public static boolean check(int index, int seat) {
for (int i = 1; i < index; i++) {//与前index-1个皇后的位置进行比较。
if(arr[i] == seat||Math.abs(index-i)==Math.abs(arr[i]-seat)&&Math.abs(index-i)<3){
//在同一列。
//在同一条 45 度角的斜线上,两个皇后之间行号的差值小于3 。
return false;
}
}
return true;
}
//index:第index个皇后。
//lay(int index):摆放第index个皇后的位置。
public static void lay(int index) {
if( index == n+1){
sum++;
return;
}
for (int seat = 1; seat <= n; seat++) {//判断第index行上,从第1列到第n列的位置哪一个合适。
if( check(index, seat)){
arr[index] = seat;
lay(index+1);
}
}
}
解法
public static int n;
public static int sum = 0;
public static int[] arr;
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
n = scan.nextInt();
arr = new int[n+1];//每一行表示一个皇后,这样可以巧妙避免两个皇后在同一行的情况。
lay(1);
System.out.println(sum);
scan.close();
}
//index:表示第index个皇后。
//seat:表示某行第seat这个位置。
//check(int index, int seat):检查第index个皇后能否坐在第index行第seat这个位置。
public static boolean check(int index, int seat) {
for (int i = 1; i < index; i++) {//与前index-1个皇后的位置进行比较。
if(arr[i] == seat||Math.abs(index-i)==Math.abs(arr[i]-seat)&&Math.abs(index-i)<3){
//在同一列。
//在同一条 45 度角的斜线上,两个皇后之间行号的差值小于3 。
return false;
}
}
return true;
}
//index:第index个皇后。
//lay(int index):摆放第index个皇后的位置。
public static void lay(int index) {
if( index == n+1){
sum++;
return;
}
for (int seat = 1; seat <= n; seat++) {//判断第index行上,从第1列到第n列的位置哪一个合适。
if( check(index, seat)){
arr[index] = seat;
lay(index+1);
}
}
}