• 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;
    			}
    		}
    		
    	}
    }
    
    
  • 相关阅读:
    初识数据库与SQL语句
    初始面向对象
    集合与深浅copy
    函数进阶
    函数操作
    文件操作
    生成器与列表生成式
    函数名的本质,闭包和迭代
    小数据库
    DAY 5 字典
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13079485.html
Copyright © 2020-2023  润新知