日期:2014-05-20  浏览次数:20709 次

高分求魔方阵算法
1,输入:魔方的阶   输出:完整的魔方


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

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

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

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

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

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


------解决方案--------------------
只要回复就给分么?
最小高的等差?
偶阶怎么搞?
------解决方案--------------------
算法不准确吧.不知道用VB能不能够实现这段代码方式.好象有点晕,阶段性问题.....
------解决方案--------------------
有matlab否?去看magic函数的代码。
一般而言,奇数阶用右(左)斜上算法,偶数阶用旋臂交换法,后者有点复杂。

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



------解决方案--------------------
给出奇数阶的算法,偶阶的还在研究!

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{