zoukankan      html  css  js  c++  java
  • 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;
    			}
    		}
    		
    	}
    }
    
    
  • 相关阅读:
    iOS 面试题搜集
    iOS 常用第三方类库、完整APP示例
    iOS 键盘遮挡输入 解决办法
    iOS UIColor RGB HEX
    iOS APP性能优化
    iOS Swift 数组 交换元素的两种方法
    iOS CoreData primitive accessor
    iOS Start developing ios apps (OC) pdf
    iOS 传值方式
    iOS IB_DESIGNABLE IBInspectable @IBDesignable @IBInspectable 加速UI开发
  • 原文地址:https://www.cnblogs.com/a1439775520/p/12948961.html
Copyright © 2011-2022 走看看