蓝桥杯2016年第七届省赛题(java)——方格填数

准备参加蓝桥杯记录一道题目----------方格填数

 

如下的10个格子
   +--+--+--+
   |  |  |  |
+--+--+--+--+
|  |  |  |  |
+--+--+--+--+
|  |  |  |
+--+--+--+

(如果显示有问题,也可以参看【图1.jpg】)

填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)

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

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

 

 

思路:可以利用深搜然后剪枝就行了

剪枝时可以利用二维数组存入相邻坐标,假设num={9,8,7,6,5,4,3,2,1,0}(顺序不重要dfs会帮我们遍历),那么num[0]相邻数的下标就是num[1],num[3],num[4],num[5]了(可以对应图片自己数看看),后面如此类推int targetnum[][]={{1,3,4,5},{0,2,4,5,6},{1,5,6},{0,4,7,8},{0,1,3,5,7,8,9},{0,1,2,4,6,8,9},{1,2,5,9},{3,4,8},{3,4,5,7,9},{4,5,6,8}};那么每个格子的相邻的下标就出来了,只要判断就好了,附上代码.

package p2017_6;

public class Main {
	static int num[]= {0,1,2,3,4,5,6,7,8,9};
	static int sum=0;
	public static void main(String[] args) {
		dfs(0);
		System.out.println(sum);
	}
	static void dfs(int step) {
		if (step==10) {
			if (targetdfs()==true) {
				sum++;
//				System.out.print(" ");
//				for (int i = 1; i < 4; i++) {
//					System.out.print(num[i]);
//				}
//				System.out.println();
//				for (int i = 4; i < 7; i++) {
//					System.out.print(num[i]);
//				}
//				System.out.println();
//				for (int i = 7; i < 10; i++) {
//					System.out.print(num[i]);
//				}
//				System.out.println();
//				System.out.println();
			
			}
			return;
		}
		for (int i = step; i < 10; i++) {
			swap(i, step);
			dfs(step+1);
			swap(i,step);
		}
	}
	static void swap(int i,int j) {
		int mid=num[i];
		num[i]=num[j];
		num[j]=mid;
	}
	static boolean targetdfs() {
			int targetnum[][]={{1,3,4,5},{0,2,4,5,6},{1,5,6},{0,4,7,8},{0,1,3,5,7,8,9},{0,1,2,4,6,8,9},{1,2,5,9},{3,4,8},{3,4,5,7,9},{4,5,6,8}};
			for (int i = 0; i < 10; i++) {
			for (int j = 0; j 

 

你可能感兴趣的:(JAVA,算法,蓝桥杯,dfs,剪枝,java)