题目
方格填数
如下的10个格子
+--+--+--+
| | | |
+--+--+--+--+
| | | | |
+--+--+--+--+
| | | |
+--+--+--+
(如果显示有问题,也可以参看【图1.jpg】)
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
答案:1580
思路:把残缺的格子补上,用一个二位3*4的二维数组表示,将第一位和最后一位赋值为-2防止影响判断,
从第二位开始填充,每次填充让该位置与左方,左上方,上方,右上方进行比较,
如果不满足,直接结束,进行下一次的填充
代码如下:
static int[] v = new int[10];//用来判断是否已经访问过
static int[][] s = new int[3][4];
static int sum = 0;
public static void main(String[] args) {
s[0][0] = -2;
s[2][3] = -2;
s(1,0,1);
System.out.println(sum);
}
public static void s(int code,int i,int j){//code表示填充到第几个方格,i,j表示二维数组的下标
if(code == 11){
for (int j2 = 0; j2 < 3; j2++) {
for (int k = 0; k < 4; k++) {
System.out.print(s[j2][k]+" ");
}
System.out.println();
}
sum++;
return;
}
for (int j2 = 0; j2 < 10; j2++) {
if(v[j2]==0){
s[i][j] = j2;
if(i>0){
if(Math.abs(s[i][j]-s[i-1][j])==1){//上方判断
continue;
}
if(j>0){
if(Math.abs(s[i][j]-s[i-1][j-1])==1) continue;//左上判断
}
if(j<3){
if(Math.abs(s[i][j]-s[i-1][j+1])==1) continue;//右上判断
}
}
if(j>0)
if(Math.abs(s[i][j]-s[i][j-1])==1){//左方判断
continue;
}
v[j2] = 1;
if(j == 3){
s(code+1,i+1,0);
}else{
s(code+1,i,j+1);
}
v[j2] = 0;
}
}
}