VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1282|回复: 3

求魔方阵算法

[复制链接]

1

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2021-3-10 14:30:02 | 显示全部楼层 |阅读模式
1,输入:魔方的阶 输出:完整的魔方


2 另外小弟还想问个问题 问题如下:
  给定n个大小各异的立方体,这些立方体每一个面的面积在1-n之间,将这些立方体堆积成两个塔,问这两个塔的最小高的等差是多少

附: 魔方阵是指元素为自然数1,2,…,N2 的N×N方阵,每个元素值均不相等,每行、列及主、副对角线上各N个元素之和都相等。

对奇阶魔方阵,可用Dole Rob算法生成,其过程为:从1开始,以此插入各自然数,直到N2为止。选择插入位置原则为:

a.    第一个位置在第一行的正中;

b.    新位置应当处于最近一个插入位置右上方,但如右上方位置已超出方阵上边界,则新位置取应选列的最下一个位置;如超出右边界则新边界取应选行的最左一个位置;

c.    若最近一个插入元素为N的整数倍,则选下面一行同列的位置为新位置。
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2021-3-10 16:00:02 | 显示全部楼层
算法不准确吧.不知道用VB能不能够实现这段代码方式.好象有点晕,阶段性问题.....
回复

使用道具 举报

0

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2021-3-10 16:30:01 | 显示全部楼层
有matlab否?去看magic函数的代码。
一般而言,奇数阶用右(左)斜上算法,偶数阶用旋臂交换法,后者有点复杂。

射雕或者神雕里面,有4阶的介绍(来源于九章算术)。。。楼主若是足够聪明,当可以推断出偶数阶是怎么实现的。


回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2021-3-10 16:45:01 | 显示全部楼层
给出奇数阶的算法,偶阶的还在研究!

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class MagicNum {
   
    private int x;
    private int y;
    /**
     * @return 返回 x。
     */
    public int getX() {
        return x;
    }

    /**
     * @param x 要设置的 x。
     */
    public void setX(int x) {
        this.x = x;
    }

    /**
     * @return 返回 y。
     */
    public int getY() {
        return y;
    }

    /**
     * @param y 要设置的 y。
     */
    public void setY(int y) {
        this.y = y;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        
        MagicNum mn=new MagicNum();
        printTxt(mn.createMagic(9));
    }
   
    private int[][] createMagic(int n){
        if(n>2){
            MagicNum mn=new MagicNum();
            int[][] magic =new int [n][n];
            
            //偶阶幻方算法
            if(n%2==0){
               
               
            }else{//奇阶幻方算法
                mn.setX((n-1)/2);
                mn.setY(0);
                magic[(n-1)/2][0]=1;
                for(int i=2;i<=n*n;i++){
                    mn.getnextXandY(magic,mn,i);
                }
            }
            return magic;
        }else{
            System.out.print("请输入大于2的自然数");
            return null;
        }
    }
   
    /**
     * Merzirac法生成奇阶幻方
     * @param magic
     * @param mn
     * @param n
     * @return
     */
    private MagicNum getnextXandY(int[][] magic,MagicNum mn,int n){
        int x =mn.getX();
        int y=mn.getY();
        
        //左上移
        if(x+1<magic.length){
            x=x+1;
        }else{
            x=0;
        }
        
        if(y<1){
           y= magic.length-1;
        }else{
            y=y-1;
        }
        
        //判断是否有数
        if(magic[x][y]==0){
            magic[x][y] =n;
        }else{
            //往原先的数下移一格
            x=mn.getX();
            y=mn.getY();
            
            if(y<magic.length-1){
                y=y+1;
            }else{
                y=0;
            }
            magic[x][y] =n;
        }
        
        mn.setX(x);
        mn.setY(y);
        
        return mn;
    }

    private static void printTxt(int[][] magic) {
        if (magic != null) {
            FileOutputStream file;
            try {
                StringBuffer s = new StringBuffer(100);
                String ret = "\r\n";
                file = new FileOutputStream("c:/magic.txt");
                for (int i = 0; i < magic.length; i++) {
                    for (int j = 0; j < magic.length; j++) {
                        s.append(magic[i][j]);
                        s.append("  ");
                        if (j == magic.length-1) {
                            s.append(ret);
                        }
                    }
                }
                byte[] bt = s.toString().getBytes();
                file.write(bt);
                file.close();
            } catch (FileNotFoundException e) {
                System.out.print("FileNotFoundException: " + e.getMessage());
            } catch (IOException e) {
                System.out.print("IOException: " + e.getMessage());
            } catch (Exception e) {
                System.out.print("Exception: " + e.getMessage());
            }

        }
    }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表