准备参加蓝桥杯记录一道题目----------方格填数
如下的10个格子
+--+--+--+
| | | |
+--+--+--+--+
| | | | |
+--+--+--+--+
| | | |
+--+--+--+
(如果显示有问题,也可以参看【图1.jpg】)
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
思路:可以利用深搜然后剪枝就行了
剪枝时可以利用二维数组存入相邻坐标,假设num={9,8,7,6,5,4,3,2,1,0}(顺序不重要dfs会帮我们遍历),那么num[0]相邻数的下标就是num[1],num[3],num[4],num[5]了(可以对应图片自己数看看),后面如此类推int targetnum[][]={{1,3,4,5},{0,2,4,5,6},{1,5,6},{0,4,7,8},{0,1,3,5,7,8,9},{0,1,2,4,6,8,9},{1,2,5,9},{3,4,8},{3,4,5,7,9},{4,5,6,8}};那么每个格子的相邻的下标就出来了,只要判断就好了,附上代码.
package p2017_6;
public class Main {
static int num[]= {0,1,2,3,4,5,6,7,8,9};
static int sum=0;
public static void main(String[] args) {
dfs(0);
System.out.println(sum);
}
static void dfs(int step) {
if (step==10) {
if (targetdfs()==true) {
sum++;
// System.out.print(" ");
// for (int i = 1; i < 4; i++) {
// System.out.print(num[i]);
// }
// System.out.println();
// for (int i = 4; i < 7; i++) {
// System.out.print(num[i]);
// }
// System.out.println();
// for (int i = 7; i < 10; i++) {
// System.out.print(num[i]);
// }
// System.out.println();
// System.out.println();
}
return;
}
for (int i = step; i < 10; i++) {
swap(i, step);
dfs(step+1);
swap(i,step);
}
}
static void swap(int i,int j) {
int mid=num[i];
num[i]=num[j];
num[j]=mid;
}
static boolean targetdfs() {
int targetnum[][]={{1,3,4,5},{0,2,4,5,6},{1,5,6},{0,4,7,8},{0,1,3,5,7,8,9},{0,1,2,4,6,8,9},{1,2,5,9},{3,4,8},{3,4,5,7,9},{4,5,6,8}};
for (int i = 0; i < 10; i++) {
for (int j = 0; j <targetnum[i].length; j++) {
if (Math.abs(num[i]-num[targetnum[i][j]])==1) {
return false;
}
}
}
return true;
}
}