方格填数
如下的10个格子
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
如下的10个格子
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
---------------------------------------------------------------------------------------------
正确答案:1580
思路很简单:
(1)二维数组,初始化全部赋值为-3,-3代表还没填入0~9
(2)f函数用于放数字n到数组arr上,同时递归f来放下一个数n+1
(3)g函数用于判断数字n是否可以放到arr[i][j]上面。
public class Main
{
static int sum=0;
public static void main(String[] args) {
int arr[][]=new int[3][4];
//初始化全部赋值为-3,-3代表还没填入0~9
for(int i=0;i<3;i++){
for(int j=0;j<4;j++){
arr[i][j]=-3;
}
}
f(arr,0);
System.out.println(sum);
}
//n代表放第几个数
public static void f(int arr[][],int n){
//如果9个数都放好了,就直接sum++
if(n==10){
sum++;
return;
}
//遍历arr数组每一个位置,看能不能放下去
for(int i=0;i<3;i++){
for(int j=0;j<4;j++){
//头尾位置不理
if(i==0&&j==0)continue;
if(i==2&&j==3)continue;
//该位置如果可以放,就放下去,然后放下一个数
if(g(arr, n, i, j)){
arr[i][j]=n;
f(arr,n+1);
arr[i][j]=-3;
}
}
}
}
//判断该位置可不可以放
public static boolean g(int arr[][],int n,int ii,int jj) {
if(arr[ii][jj]!=-3)return false;
for(int i=ii-1;i<=ii+1;i++){
for(int j=jj-1;j<=jj+1;j++){
if(i==-1||i==3||j==-1||j==4)continue;
if(i==ii&&j==jj)continue;
if(arr[i][j]==n-1||arr[i][j]==n+1)return false;
}
}
return true;
}
}