欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

六角填数

程序员文章站 2023-12-23 17:49:33
...

题目描述
如图所示六角形中,填入1~12的数字。

六角填数

使得每条直线上的数字之和都相同。

图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少?

请通过浏览器提交答案,不要填写多余的内容。

代码如下:
对于每一个格子,试探所有可能的数字,直至满足要求

import java.util.*;

public class Main {
	static int[] arr = new int[14];
	static boolean[] vis = new boolean[14];

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);

		arr[1] = 1;
		vis[1] = true;
		arr[2] = 8;
		vis[8] = true;
		arr[12] = 3;
		vis[3] = true;

		dfs(1);
		scan.close();
	}

	/**
	 * 递归填数
	 * 
	 * @param x
	 *            递归深度
	 */
	static void dfs(int x) {
		// 第一个和第二个格子不填数,直接填下一个格子
		if (x == 1 || x == 2) {
			dfs(x + 1);
			return;
		}
		// 递归出口
		if (x == 12) {
			if (check()) {
				System.out.println("*=" + arr[6]);
			}
		}

		// 对每一个顶点,试探所有可行的数字
		for (int i = 1; i <= 12; i++) {
			if (vis[i]) {
				continue;
			}
			vis[i] = true; // 标记该数字,防止重复填入该数
			arr[x] = i; // 填数
			dfs(x + 1); // 填下一个格子
			vis[i] = false; // 恢复该数字,使得其他递归调用时可以使用该数字
		}
	}

	/**
	 * 检查当前所填数字是否符合题目要求
	 * 
	 * @return
	 */
	static boolean check() {
		int t[] = new int[6];
		t[0] = arr[1] + arr[3] + arr[6] + arr[8];
		t[1] = arr[1] + arr[4] + arr[7] + arr[11];
		t[2] = arr[2] + arr[3] + arr[4] + arr[5];
		t[3] = arr[2] + arr[6] + arr[9] + arr[12];
		t[4] = arr[8] + arr[9] + arr[10] + arr[11];
		t[5] = arr[12] + arr[10] + arr[7] + arr[5];

		for (int i = 1; i < t.length; i++) {
			if (t[i] != t[i - 1])
				return false;
		}

		return true;
	}
}

相关标签: java蓝桥杯

上一篇:

下一篇: