6.方格填数 (结果填空)
如下的10个格子
(如果显示有问题,也可以参看【图1.jpg】)
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
提示:和前面第4题分小组,都是用的全排列的思想,只是这个附加了条件,在递归出口时多加一下题目里的附加条件
思路:将表格从上到下从左到右从0开始编号 ,判断每种相邻的方案是否为连续数字,不是则+1
public class _6方格填数 {
public static void main(String[] args) {
// char[] str={'0','1','2','3','4','5','6','7','8','9'};
char[] str="0123456789".toCharArray();
paixu(str, 0, str.length-1);
System.out.println(count);
}
public static int count=0;
//交换位置
public static void swap(char[] c,int i,int j){
char temp = c[i];
c[i] = c[j];
c[j] = temp;
}
//排序
public static void paixu(char[] c,int from,int to){
if (to<=1) {
return;
}if (from == to) {
if (check(c)) {
count++;
}
}else{
for (int i = from; i <= to; i++) {
swap(c, i, from);
paixu(c, from+1, to);
swap(c, from, i);
}
}
}
// 检查左右,上下,对角不是相邻的数字
public static boolean check(char[] c) {
if (check2(c[0], c[1]) && check2(c[0], c[3]) && check2(c[0], c[4])&& check2(c[0], c[5])
&& check2(c[1], c[2])&& check2(c[1], c[4])&& check2(c[1], c[5])&& check2(c[1], c[6])
&& check2(c[2], c[5])&& check2(c[2], c[6])
&& check2(c[3], c[4])&& check2(c[3], c[7])&& check2(c[3], c[8])
&& check2(c[4], c[5])&& check2(c[4], c[7])&& check2(c[4], c[8])&& check2(c[4], c[9])
&& check2(c[5], c[6])&& check2(c[5], c[8])&& check2(c[5], c[9])
&& check2(c[6], c[9])
&& check2(c[7], c[8])
&& check2(c[8], c[9])) {
return true;
}
return false;
}
// 检查相邻的数字
public static boolean check2(char a,char b){
if (a == (b+1)||a==(b-1)) {
return false;
}
return true;
}
}
运行结果:1580