java计算奇数阶魔方阵

一、提出问题

所谓“奇数阶魔方阵”是指n为不小于3的奇数的魔方阵。这类魔方阵的形式多样,这里我们仅讨论其中的一种形式的正规魔方阵。例如:3阶、5阶和7阶的魔方阵如图3 – 4 所示。

图3 – 4 3阶5阶和7阶魔方阵

容易知道,这三个魔方阵的魔方常数分别是15、65和175。

现在要求给出:能让计算机自动输出类似图3 – 4 所示的n阶奇数魔方阵的算法,其中n为任意给定的一个不小于3的奇数。

二、简单分析

决定“奇数阶魔方阵”的关键是要按要求决定其方阵中的各个数字。观察图3 – 4中的三个奇数阶魔方阵,不难发现:

1.由于是正规魔方,故所填入的n 2个不同整数依次为1、2、3、…、n 2 ;

2.各行、列和对角线上的数字虽各不相同,但其和却是相同的。这表明,其魔方常数可由公式n ( n2 + 1 ) / 2得到。

3.数字在阵列中的次序,并没有遵从阵列单元的行、列下标的顺序,但数字“1”却始终出现在阵列第一行的正中间位置,而数字“n 2”也始终出现在阵列第n行的正中间位置,这说明阵列中的数字排列应该是有一定规律的。

import java.util.Scanner;
/**
 * 
 * @author 冷血
 *
 */
public class Java_4 {
    private int[][] a;
    private int j ,i ,sum = 1;
    private int N,n;
    public Java_4(int n){
        N = n;
        this.n = n;
            N=N-1;
         a = new int[n][n];
    }
    public void jiSuan(){
        i = 0; j=n/2;
        a[i][j] =sum ;
        while(sum<=n*n){
            if(i==0&&j!=N){
                i = N;
                j++;
                sum++;
                a[i][j]=sum;
                }
            if(sum==n*n)
                break;
            if(j==N&&i!=0){
                j=0;
                i--;
                sum++;
                a[i][j]=sum;        
            }
            if(j==N&&i==0){
                
                i++;
                
                sum++;
                a[i][j]=sum;
                
            }
            if(sum==n*n)
                break;
            if(i!=0&&j!=N&&a[i-1][j+1]==0){
                i--;j++;sum++;
                a[i][j] = sum;
            }
            if(sum==n*n)
                break;
            if(i!=0&&j<N&&a[i-1][j+1]!=0){
                i++;sum++;
                a[i][j] = sum;
            
            }
            if(sum==n*n)
                break;
        }
        if(i==0&&j==0){
            i=N;sum++;j++;
            a[i][j] = sum;
        }
    }
    public void paint(){
        for(int k = 0;k<a.length;k++){
            for(int l = 0;l<a.length;l++){
                System.out.printf("%-5d",a[k][l]);
            }
            System.out.println();
            System.out.println();
        }
    }
    public static void main(String[] args) {
        int m=0;
        @SuppressWarnings("resource")
        Scanner nuber = new Scanner(System.in);
        m = nuber.nextInt();
        Java_4 java = new Java_4(m);
        java.jiSuan();
        java.paint();
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏yl 成长笔记

时间复杂度的概念以及计算

The time complexity of an algorithm quantifies the amout of time taken by an alg...

772
来自专栏小文博客

蓝桥杯 C语言省赛 习题3 移动距离

2006
来自专栏和蔼的张星的图像处理专栏

2. 尾部的零

设计一个算法,计算出n阶乘中尾部零的个数 样例 11! = 39916800,因此应该返回 2. 这其实是一个数学题,思路倒是很简单,主要就是找每个数有多...

1133
来自专栏灯塔大数据

每周学点大数据 | No.43 相似连接的可扩展性

No.43期 相似连接的可扩展性 小可:那么具体是怎么做的呢? Mr. 王:我们先来看看求单元函数值是如何在 MapReduce 上实现的吧。 ? 图中有三...

3537
来自专栏desperate633

LintCode 哈希函数题目代码

在数据结构中,哈希函数是用来将一个字符串(或任何其他类型)转化为小于哈希表大小且大于等于零的整数。一个好的哈希函数可以尽可能少地产生冲突。一种广泛使用的哈希函数...

994
来自专栏mathor

奇数魔方阵(奇数幻方)

1283
来自专栏数据结构与算法

洛谷 P3807 【模板】卢卡斯定理

题目背景 这是一道模板题。 题目描述 给定 求  保证P为prime C表示组合数。 一个测试点内包含多组数据。 输入输出格式 输入格式: 第一行一...

2684
来自专栏calmound

poj 2886 Who Gets the Most Candies?

题意:n个人围城一圈,每个人决定下一个出局的人在他的第几个位置,首先出局的人是第k个人 分析:反素数+约瑟夫 这道题最主要需要理解的就是线段树是如何模拟的反素...

2886
来自专栏程序员互动联盟

【编程之美】最短路径

最短路径 任意给定两个数字A和B,通过将A和6个数(7,-7,5,-5,12,-12)做加减运算,运算次数不限,每个数可以被使用多次,求从A到B最少要经过多少次...

3886
来自专栏数据结构与算法

BZOJ4766: 文艺计算姬

Description "奋战三星期,造台计算机"。小W响应号召,花了三星期造了台文艺计算姬。文艺计算姬比普通计算机有更多的艺 术细胞。普通计算机能计算一个带...

3098

扫码关注云+社区