方格填数
如下的10个格子
±-±-±-+
| | | |
±-±-±-±-+
| | | | |
±-±-±-±-+
| | | |
±-±-±-+
(如果显示有问题,也可以参看【图1.jpg】)
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
答案:1580
package dat1;
public class Main5 {
public static int x = 0;
//将数组z的a、b位置的值做交换
public static void exchange(int a, int b, int z[]) {
int h = z[a];
z[a] = z[b];
z[b] = h;
}
//递归实现0~9的全排列
public static void lanqiao6(int[] a, int n, int m) {
if (n == m) {//当n==m时实现了一次全排列
int l = 1;
for (int q = 0; q < 10; q++) {//此循环判断这次全排列是否符合题目要求,注意边缘数
if (q != 7) {
if (q - 5 >= 0 && (a[q - 5] == a[q] + 1 || a[q - 5] == a[q] - 1)) {
l = 0;
break;
}
}
if (q - 4 >= 0 && (a[q - 4] == a[q] + 1 || a[q - 4] == a[q] - 1)) {
l = 0;
break;
}
if (q != 6) {
if (q - 3 >= 0 && (a[q - 3] == a[q] + 1 || a[q - 3] == a[q] - 1)) {
l = 0;
break;
}
}
if (q != 3 && q != 7) {
if (q - 1 >= 0 && (a[q - 1] == a[q] + 1 || a[q - 1] == a[q] - 1)) {
l = 0;
break;
}
}
if (q != 2 && q != 6) {
if (q + 1 < 10 && (a[q + 1] == a[q] + 1 || a[q + 1] == a[q] - 1)) {
l = 0;
break;
}
}
if (q != 3) {
if (q + 3 < 10 && (a[q + 3] == a[q] + 1 || a[q + 3] == a[q] - 1)) {
l = 0;
break;
}
}
if (q + 4 < 10 && (a[q + 4] == a[q] + 1 || a[q + 4] == a[q] - 1)) {
l = 0;
break;
}
if (q != 2) {
if (q + 5 < 10 && (a[q + 5] == a[q] + 1 || a[q + 5] == a[q] - 1)) {
l = 0;
break;
}
}
}
if (l == 1) {
x++;
}
}
for (int i = n; i < m; i++) {
exchange(n, i, a);
lanqiao6(a, n + 1, m);
exchange(n, i, a);
}
}
public static void main(String[] args) {
int[] a = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
lanqiao6(a, 0, 10);
System.out.println(x);
}
}