【蓝桥杯2016JavaB】放格填数

方格填数

如下的10个格子
在这里插入图片描述
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

这道题还是先全排列,然后进行check检查,符合要求的counts++,还好只有十个格子,一一检测就行。

public class Main{
    
    
	public static int counts=0;
	public static void main(String[]arms) {
    
    
		int[] nums= {
    
    0,1,2,3,4,5,6,7,8,9};
		arr(nums, 0);
		System.out.println(counts);
		
	}
	public static void arr(int[]nums,int i) {
    
    
		if(i>=nums.length-1) {
    
    
			if(check(nums))counts++;
			return;
		}
		for(int j=i;j<nums.length;j++) {
    
    
			sweap(nums, i, j);
			arr(nums,i+1);
			sweap(nums, i, j);
		}
	}
	public static void sweap(int[]nums,int a,int b) {
    
    
		int temp=0;
		temp=nums[a];
		nums[a]=nums[b];
		nums[b]=temp;
	}
	public static boolean check(int[]nums) {
    
    
		if (    abs(nums[0] - nums[1]) == 1 || abs(nums[0] - nums[3]) == 1 || 
				abs(nums[0] - nums[4]) == 1 || abs(nums[0] - nums[5]) == 1 ||
				abs(nums[1] - nums[2]) == 1 || abs(nums[1] - nums[4]) == 1 ||
				abs(nums[1] - nums[5]) == 1 || abs(nums[1] - nums[6]) == 1 ||
				abs(nums[2] - nums[5]) == 1 || abs(nums[2] - nums[6]) == 1 ||
				abs(nums[3] - nums[4]) == 1 || abs(nums[3] - nums[7]) == 1 || 
				abs(nums[3] - nums[8]) == 1 || abs(nums[4] - nums[5]) == 1 || 
				abs(nums[4] - nums[7]) == 1 || abs(nums[4] - nums[8]) == 1 || 
				abs(nums[4] - nums[9]) == 1 || abs(nums[5] - nums[6]) == 1 || 
				abs(nums[5] - nums[8]) == 1 || abs(nums[5] - nums[9]) == 1 ||
				abs(nums[6] - nums[9]) == 1 || abs(nums[7] - nums[8]) == 1 ||
				abs(nums[8] - nums[9]) == 1)
			return false;
		return true;
	}
	private static int abs(int i) {
    
    
		return Math.abs(i);
	}
}

最终答案1580

猜你喜欢

转载自blog.csdn.net/VanGotoBilibili/article/details/115426808