蓝桥杯方格填数(java代码)

方格填数
如下的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;
		
	}
     
}  

猜你喜欢

转载自blog.csdn.net/ranandrun/article/details/79736088