第七届蓝桥杯省赛C语言B组第6题 方格填数

时间:2022-09-10 13:56:58

方格填数

如下的10个格子
+–+–+–+
| | | |
+–+–+–+–+
| | | | |
+–+–+–+–+
| | | |
+–+–+–+

(如果显示有问题,也可以参看【图1.jpg】)

填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)

一共有多少种可能的填数方案?

请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

第七届蓝桥杯省赛C语言B组第6题 方格填数
用java写的


public class F方格填数 {
int k = 0;
public static void main(String[] args) {
F方格填数 obj = new F方格填数();
obj.init();
}

private void init() {
fun(new int[10], 0);
System.out.println(k);
}

private void fun(int[] is, int ins) { // is是存放数据的数组, ins为当前下标
if (ins == 10) { // 如果下标等于10 则 is数组已经有十个数
check(is);
} else {
for (int i = 0; i < 10; i++) {
boolean flag = true;
for (int j = 0; j < ins; j++) { // 查重复
if (is[j] == i) {
flag = false;
}
}
if (flag) {
is[ins] = i;
fun(is, ins + 1);
}
}
}
}

private void check(int[] is) {
int array[][] = new int[3][4]; // 存放is数据的二位数组
int moves[][] = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 }, { 1, -1 }, { -1, 1 }, { -1, -1 }, { 1, 1 } }; // 移动方向
int i;
int m;
int j;
boolean flag = true;
int w = 0;
for (i = 0; i < 3; i++) {
for (j = 0; j < 4; j++) {
if (i == 0 && j == 0 || (i == 2 && j == 3)) { // 如果是第一个点或者是最后一个点则跳过
continue;
}
array[i][j] = is[w++]; // 把is数据放到array中
}
}
for (i = 0; i < 3; i++) {
for (j = 0; j < 4; j++) {
if (i == 0 && j == 0 || (i == 2 && j == 3)) {// 如果是第一个点或者是最后一个点则跳过
continue;
}
for (m = 0; m < 8; m++) {
int x = i + moves[m][0];
int y = j + moves[m][1];
if (x < 0 || x > 2 || y < 0 || y > 3 || (x == 0 && y == 0) || (x == 2 && y == 3)) {// 判断是否下标越界或者
// 是否是第一个点或最后一个点
continue;
}
if (array[i][j] - 1 == array[x][y] || array[i][j] + 1 == array[x][y]) { //判断array[i][j]点是否与array[x][y]连续
break;
}
}
if (m != 8) {
flag = false; //如果flag等于false,则此数据不符合条件
}
}
}
if (flag) {
// for (i = 0; i < 3; i++) {
// for (j = 0; j < 4; j++) {
// System.out.print(array[i][j] + " ");
// }
// System.out.println();
// }
// System.out.println();
k++;
}
}

}

最后结果1580