如下的10个格子
+--+--+--+| | | |
+--+--+--+--+
| | | | |
+--+--+--+--+
| | | |
+--+--+--+
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)一共有多少种可能的填数方案?
请填写表示方案数目的整数。
答:1580
解:
public class Main {
static int sum = 0;
static void fun(int[] a, int[] b, int n) {
if (n == 10) {
// 排除相邻的数是连续的情况
if (Math.abs(a[0] - a[1]) != 1 && Math.abs(a[0] - a[3]) != 1 && Math.abs(a[0] - a[4]) != 1
&& Math.abs(a[0] - a[5]) != 1)
if (Math.abs(a[1] - a[2]) != 1 && Math.abs(a[1] - a[4]) != 1 && Math.abs(a[1] - a[5]) != 1
&& Math.abs(a[1] - a[6]) != 1)
if (Math.abs(a[2] - a[5]) != 1 && Math.abs(a[2] - a[6]) != 1)
if (Math.abs(a[3] - a[4]) != 1 && Math.abs(a[3] - a[7]) != 1 && Math.abs(a[3] - a[8]) != 1)
if (Math.abs(a[4] - a[5]) != 1 && Math.abs(a[4] - a[7]) != 1 && Math.abs(a[4] - a[8]) != 1
&& Math.abs(a[4] - a[9]) != 1)
if (Math.abs(a[5] - a[6]) != 1 && Math.abs(a[5] - a[8]) != 1
&& Math.abs(a[5] - a[9]) != 1)
if (Math.abs(a[6] - a[9]) != 1)
if (Math.abs(a[7] - a[8]) != 1)
if (Math.abs(a[8] - a[9]) != 1) {
sum++;
return;
}
}
for (int i = 0; i < 10; i++) {
if (b[i] == 0) {
a[n] = i;
b[i] = 1;
fun(a, b, n + 1);
b[i] = 0;
}
}
}
public static void main(String[] args) {
int[] a = new int[10];
int[] book = new int[10];// 用来排除数字重复的情况
fun(a, book, 0);
System.out.println(sum);
}
}