奇数魔方阵(奇数幻方)

说明:

将1到n(为奇数)的数字排列在nxn的方阵上,且各行、各列与各对角线的和必须相同。

解法:

填魔术方阵的方法以奇数最为简单,第一个数字放在第一行第一列的正中央,然后向右(左)上填,如果右(左)上已有数字,则向下填,如下图所示:

一般程式语言的阵列索引多由0开始,为了计算方便,我们利用索引1到n的部分,而在计算向右上时,我们可以将索引值除以n值,如果得到余数为1就向下,否则就往右上,原理很简单,看看是不是已经在同一列上绕一圈就对了。

C:

#include <stdio.h> 
#include <stdlib.h> 
#define N 5 
int main() 
{ 
    int i, j, key; 
    int square[N+1][N+1] = {0}; 
    i = 0; 
    j = (N+1) / 2; 
    for(key = 1; key <= N*N; key++) 
    { 
        if((key % N) == 1) 
            i++; 
        else { 
            i--; 
            j++; 
        } 
        if(i == 0) 
            i = N; 
        if(j > N) 
            j = 1; 
        square[i][j] = key; 
    } 
    for(i = 1; i <= N; i++) 
    { 
        for(j = 1; j <= N; j++) 
            printf("%2d ", square[i][j]); 
    } 
    return 0; 
}

Java:

public class Matrix 
 {
     public static int[][] magic(int n) 
     {
         int[][] square = new int[n+1][n+1]; 
         int i = 0; 
         int j = (n+1) / 2; 
         for(int key = 1; key <= n*n; key++) 
         { 
             if((key % n) == 1) 
                 i++; 
             else 
             { 
                 i--; 
                 j++; 
             } 
             if(i == 0) 
                 i = n; 
             if(j > n) 
                 j = 1; 
             square[i][j] = key; 
         }   
         int[][] matrix = new int[n][n];
         for(int k = 0; k < matrix.length; k++) 
         {
             for(int l = 0; l < matrix[0].length; l++)
             {
                matrix[k][l] = square[k+1][l+1];
             }
         }
         return matrix;
     }
     public static void main(String[] args) 
     {
         int[][] magic = magic(7);
         for(int k = 0; k < magic.length; k++) 
         {
             for(int l = 0; l < magic[0].length; l++) 
             {
                 System.out.print(magic[k][l] + " ");
             }
             System.out.println();
          }
     }
 }

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏智能算法

ZIP压缩算法详细分析及解压实例解释(下)

来源:esingchan - 博客园 链接:www.cnblogs.com/esingchan/p/3958962.html(点击尾部阅读原文前往) 7、ZIP...

4156
来自专栏lhyt前端之路

js版本的(广、深)度优先搜索0. 前言1.队列、栈2.BFS1.1 矩阵形式的图的遍历1.2 树的BFS举例3.DFS

广度优先搜索(BFS)和深度优先搜索(DFS),大家可能在oj上见过,各种求路径、最短路径、最优方法、组合等等。于是,我们不妨动手试一下js版本怎么玩。

832
来自专栏趣谈编程

二分查找

面试官:写个二分热热身 我心想:不用热身,热的手已经出汗了 二分查找有着查找速度快,平均性能好等优点,但必须要求待查表为有序表,且插入删除困难,面试比较常考,今...

1956
来自专栏无所事事者爱嘲笑

常用的sort打乱数组方法真的有用?

1806
来自专栏Crossin的编程教室

【每周一坑】杨辉三角形

杨辉三角形,也称帕斯卡三角,其定义为:顶端是 1,视为(row0).第1行(row1)(1&1)两个1,这两个1是由他们上头左右两数之和 (不在三角形内的数视为...

2554
来自专栏决胜机器学习

《编程之美》读书笔记(一)——中国象棋将帅有效位置

《编程之美》读书笔记(一) ——中国象棋将帅有效位置 (原创内容,转载请注明来源,谢谢) 一、问题 ? 如上述棋盘,假设将为点A,帅为点B。将只能在d10...

3476
来自专栏Java3y

Map集合、散列表、红黑树介绍

1343
来自专栏Bingo的深度学习杂货店

Q28 Implement strStr()

Implement strStr(). Return the index of the first occurrence of needle in haysta...

31510
来自专栏java一日一条

前端面试中常见的算法问题总结

虽说我们很多时候前端很少有机会接触到算法。大多都交互性的操作,然而从各大公司面试来看,算法依旧是考察的一方面。实际上学习数据结构与算法对于工程师去理解和分析问题...

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

P1181 数列分段Section I

题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成连续的若干段,并且每段和不超过M(可以等于M),问最少能将其分成多少段使得满足要求。 输入输出...

3305

扫码关注云+社区