MarcusV(南墙大佬的搬运工)

南墙大佬的CSDN博客地址

导航

Java实现蓝桥杯 九宫幻方

九宫幻方
D: 今天做一道题目 九宫幻方

小明最近在教邻居家的小朋友小学奥数,而最近正好讲述到了三阶幻方这个部分。
三阶幻方指的是将1~9不重复的填入一个3*3的矩阵当中,使得每一行、每一列和每一条对角线的和都是相同的。
三阶幻方又被称作九宫格,在小学奥数里有一句非常有名的口诀: “二四为肩,六八为足,左三右七,戴九履一,五居其中”, 通过这样的一句口诀就能够非常完美的构造出一个九宫格来。
4 9 2
3 5 7
8 1 6

有意思的是,所有的三阶幻方,都可以通过这样一个九宫格进行若干镜像和旋转操作之后得到。 现在小明准备将一个三阶幻(不一定是上图中的那个)中的一些数抹掉,交给邻居家的小朋友来进行还原,并且希望她能够判断出究竟是不是只有一个解。
而你呢,也被小明交付了同样的任务,但是不同的是,你需要写一个程序~

输入格式:
输入仅包含单组测试数据。 每组测试数据为一个3*3的矩阵,其中为0的部分表示被小明抹去的部分。 对于100%的数据,满足给出的矩阵至少能还原出一组可行的三阶幻方。
输出格式:
如果仅能还原出一组可行的三阶幻方,则将其输出,否则输出“Too Many”(不包含引号)。

样例输入
0 7 2
0 5 0
0 3 0

样例输出
6 7 2
1 5 9
8 3 4

本题思路为列出所有的九宫幻方,将输入的数字与其一 一比较,用字符串来储存幻方。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Z: 这道题题意大概是,通过上方的幻方本体,可以变化成所有不同的幻方。而我们要做的就是将被抹掉的数字还原。如果还原情况有多种,则返回Too Many

M: 这题没有什么太好的思路,求解!

import java.util.Scanner;


public class jiugonghuanfang {
	static int [] num = new int [10];
	public static int count=0;
	static boolean [] bool = new boolean [10];
	static boolean [] bo = new boolean [10];
	public static void main(String[] args) {
		Scanner sc =new Scanner(System.in);
		for (int i = 1; i < num.length; i++) {
			num[i]=sc.nextInt();
			bo[num[i]]=true;
		}
		f(1);
	//	System.out.println(count);
	}
	public static void f(int step){
		if(step==10){
			int a = num[3]+num[1]+num[2];
			int b = num[6]+num[4]+num[5];
			int c = num[7]+num[8]+num[9];
			int d = num[4]+num[1]+num[7];
			int e = num[8]+num[5]+num[2];
			int f = num[3]+num[6]+num[9];
			int g = num[5]+num[1]+num[9];
			int h = num[3]+num[5]+num[7];
			if(a!=b ||a!=c ||a!=d ||a!=e ||a!=f ||a!=g ||a!=h ){
				return;
			}
			else{
				System.out.println(num[1]+" "+num[2]+" "+num[3]);
				System.out.println(num[4]+" "+num[5]+" "+num[6]);
				System.out.println(num[7]+" "+num[8]+" "+num[9]);
				System.out.println();
			}
			
	//		int i = num[0]+num[1]+num[2];
			count++;
			return;
		}
		if(num[step]!=0){
			f(step+1);
			return;
		}
		for (int i = 1; i <10; i++) {
			if(!bool[i] && !bo[i] && num[step]==0){
				bool[i]=true;
				num[step]=i;
				f(step+1);
				num[step]=0;
				bool[i]=false;
			}
		}
		
	}
}

posted on 2019-05-30 22:10  MarcusV  阅读(15)  评论(0编辑  收藏  举报