第七届蓝桥杯 JavaB 方格填数
方格填数
如下的10个格子
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
答案: 1580
法一: 思路:
给10个位置编号,dfs,检查合法则count++。
/**
*
* @description TODO
* @author frontier
* @time 2019年3月11日 下午5:45:20
*
*/
public class 结果填空6方格填数 {
static int n;
static int[] a = new int[11];
static boolean[] vis = new boolean[11];
static int count;
public static void main(String[] args) {
dfs(0);
System.out.println(count);
}
static boolean check() {
if (j(a[0], a[1]) || j(a[0], a[4]) || j(a[0], a[5]) || j(a[0], a[3]) || j(a[1], a[2]) || j(a[1], a[5])
|| j(a[1], a[4]) || j(a[1], a[6]) || j(a[2], a[6]) || j(a[2], a[5]))
return false;
if (j(a[3], a[4]) || j(a[3], a[7]) || j(a[3], a[8]) || j(a[4], a[5]) || j(a[4], a[8]) || j(a[4], a[7])
|| j(a[4], a[9]) || j(a[5], a[9]) || j(a[5], a[8]) || j(a[5], a[6]) || j(a[6], a[9]))
return false;
if (j(a[7], a[8]) || j(a[8], a[9]))
return false;
return true;
}
static boolean j(int a, int b) {
if (Math.abs(a - b) <= 1)
return true;
return false;
}
static void dfs(int n) {
if (n == 10) {
if (check()) {
count++;
}
return;
}
for (int i = 0; i <= 9; ++i) {
if (!vis[i]) {
vis[i] = true;
a[n] = i;
dfs(n + 1);
vis[i] = false;
}
}
}
}