|
发表于 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());
}
}
}
} |
|