第七届蓝桥杯方格填数

第七届蓝桥杯方格填数,使用dfs的做法深搜;


package com.huat.lanqiao7;
/**
 * 
 * @author yanzz
 * @编辑时间:2018年3月15日
 * @功能说明:方格填数
 * 
 * 			如下的10个格子
 * 
 *            (如果显示有问题,也可以参看【图1.jpg】)
 * 
 *            填入0~9的数字。要求:连续的两个数字不能相邻。 (左右、上下、对角都算相邻)
 * 
 *            一共有多少种可能的填数方案?
 * 
 *            请填写表示方案数目的整数。 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字
 * @version:
 */
public class NO_6 {

	private static int[][] map = new int[3][4];// 二维数组
	private static int[][] flag = new int[3][4];// 判断是否可以填数
	private static boolean[] visit = new boolean[10];
	static int ans = 0;

	public static void init() {
		for (int i = 0; i < 3; i++) {
			for (int j = 0; j < 4; j++) {
				flag[i][j] = 1;
			}
		}
		flag[0][0] = 0;
		flag[2][3] = 0;
	}

	public static void solve() {
		int dir[][] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}, {1, 1}, {1, -1},
				{-1, 1}, {-1, -1}};

		boolean flag1 = true;

		for (int i = 0; i < 3; i++) {
			for (int j = 0; j < 4; j++) {
				if (flag[i][j] == 0) {
					continue;
				} else {
					// 判断每个数周围
					for (int k = 0; k < dir.length; k++) {
						int x, y;
						x = i + dir[k][0];
						y = j + dir[k][1];
						if (x < 0 || x >= 3 || y < 0 || y >= 4
								|| flag[x][y] == 0) {
							continue;
						}
						if (1 == Math.abs(map[x][y] - map[i][j])) {
							flag1 = false;
						}
					}
				}
			}
		}
		if (flag1 == true) {
			ans++;
		}
	}

	public static void dfs(int index) {
		int x, y;
		x = index / 4;
		y = index % 4;
		if (x == 3) {
			solve();
			return;
		}
		if (1 == flag[x][y]) {
			// 0-9
			for (int i = 0; i < 10; i++) {
				if (visit[i] == false) {
					visit[i] = true;
					map[x][y] = i;
					dfs(index + 1);
					visit[i] = false;
				}
			}
		} else {
			dfs(index + 1);
		}
	}

	public static void main(String[] args) {
		init();
		dfs(0);
		System.out.println(ans);
	}

}


你可能感兴趣的:(练习题)