幻方的特点是:由自然数构成n×n正方形阵列,称为n阶幻方,每一行、每一列、两对角线上的数之和相等。当n为奇数时,我们称幻方为奇阶幻方。法国人罗伯总结出了构造奇数阶连续自然数幻方的简单易行的方法“罗伯法”。奇数幻方有杨辉法,罗伯法(楼梯法)。
8 | 1 | 6 |
3 | 5 | 7 |
4 | 9 | 2 |
以上就是一个3阶幻方(奇数)
罗伯法
把1(或最小的数)放在第一行正中
按以下规律排列剩下的n2-1个数(n表示阶数)
- 每一个数放在前一个数的右上一格;
- 如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列;
- 如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行;
- 如果这个数(例如6)所要放的格已经超出了顶行且超出了最右列那么就把它放在它的下一行同一列的格内;
- 如果这个数所要放的格已经有数填入,处理方法同(4);
下面是3阶幻方代码。
package lx;
public class luobofa1 {
public static void main(String[] args) {
int [][] a =new int[3][3];//定义一个3x3的数组
int x,y,n=3;//n用来表示几阶
x=0;
y=(n-1)/2;
int sum1=1;
a[x][y]=1;
for(int i=0;i<n*n-1;i++) {
x=x-1;
y=y+1;
if(x<0&&y<n)//超出顶端
{
x=n-1;
a[x][y]=++sum1;
}else if(x<n&&x>=0&&y>n-1)//超出右侧
{
y=y-n;
a[x][y]=++sum1;
}else if(x<0&&y>n-1) { //超出顶端且最右侧
x=x+2;
y=y-1;
a[x][y]=++sum1;
}else if(a[x][y]!=0){ //有数填入
x=x+2;
y=y-1;
a[x][y]=++sum1;
}else{ //前一个数的右上一格
a[x][y]=++sum1;
}
}
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
System.out.print(a[i][j]+" ");
}
System.out.println();
}
}
}