【蓝桥杯】2016年第七届蓝桥杯省赛真题-Java语言B组-6-方格填数

方格填数


如下的10个格子

   +--+--+--+
   |  |  |  |
+--+--+--+--+
|  |  |  |  |
+--+--+--+--+
|  |  |  |
+--+--+--+

(如果显示有问题,也可以参看【图1.jpg】)
在这里插入图片描述
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)

一共有多少种可能的填数方案?

请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。


分析:
这是一个典型的用递归实现全排列的题目,可以对十个位置可能出现的数字的情况进行全排列,判断,检验是否符合条件。

递归实现全排列是一个基本固定的套路,不太了解的可以看看这篇博文:如何用递归实现全排列?传送门


代码:

import static java.lang.Math.*;
public class Main {

	static int[] a = {0,1,2,3,4,5,6,7,8,9};
	static int ans;
	
	public static void main(String[] args) {
		f(0);
		System.out.println(ans);
	}

	private static void f(int k) {
		if (k == 9) {
			if (check()) {
				ans++;
			}
		}
		
		for (int i = k; i < a.length; i++) {
			int t = a[i];
			a[i] = a[k];
			a[k] = t;
			
			f(k+1);
			
			t = a[i];
			a[i] = a[k];
			a[k] = t;
		}
	}

	private static boolean check() {
		if(abs(a[0] - a[1]) == 1 ||
		        abs(a[0] - a[3]) == 1 ||
		        abs(a[0] - a[4]) == 1 ||
		        abs(a[0] - a[5]) == 1 ||

		        abs(a[1] - a[2]) == 1 ||
		        abs(a[1] - a[4]) == 1 ||
		        abs(a[1] - a[5]) == 1 ||
		        abs(a[1] - a[6]) == 1 ||

		        abs(a[2] - a[5]) == 1 ||
		        abs(a[2] - a[6]) == 1 ||

		        abs(a[3] - a[4]) == 1 ||
		        abs(a[3] - a[7]) == 1 ||
		        abs(a[3] - a[8]) == 1 ||

		        abs(a[4] - a[5]) == 1 ||
		        abs(a[4] - a[7]) == 1 ||
		        abs(a[4] - a[8]) == 1 ||
		        abs(a[4] - a[9]) == 1 ||

		        abs(a[5] - a[6]) == 1 ||
		        abs(a[5] - a[8]) == 1 ||
		        abs(a[5] - a[9]) == 1 ||

		        abs(a[6] - a[9]) == 1 ||

		        abs(a[7] - a[8]) == 1 ||

		        abs(a[8] - a[9]) == 1
				) {
			return false;
		}
		return true;
	}

}

答案:1580

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值