N阶数字魔方
原理: 定义一个奇数阶二维数组,把每个元素顺序填入不同的自然数,要求行列和对角线元素相加的结果相等。
效果图:
实现代码:
import java.util.*;
public class MF{
public static void main(String[] args) {
Scanner input= new Scanner(System.in);
System.out.println("请输入奇数构造魔方:");
int p=input.nextInt();
if(p%2==0)
System.out.println("请输入奇数");//如果输入的是非奇数则不再执行
else {
int n=p;
int[][] a = new int[n][n];//构造二维数组
int hang,lei;//定义行和列
hang=0;//要填充的初始行为第一行
lei=n/2;//从中间一列开始填充
for(int i=1;i<=n*n;i++)
{
a[hang][lei]=i;//第一行中间一个数填充为1
hang--;
lei++;//行减一行,列加一列,开始填充此格的右上方一格
if(hang<0&&lei>=n) {//行和列同时越界
hang=hang+2;
lei--;//从前一个格的下方重新开始
}
if(hang<0)//行越界
hang=n-1;//从当前越界格的最下一列开始
if(lei>=n)//列越界
lei=0;//从第一列重新开始
if(a[hang][lei]!=0) {//此格已被填充
hang=hang+2;
lei--;//从前一格的下一格重新开始
}
}
for(int[] i:a) {//输出数组
for(int j:i) {
System.out.print(j+"\t");
}
System.out.println();
}
}
}
}
旋转魔方:
原理:输入任意整数显示如下转圈数字,处理和数字魔方类似,1到n*n填到二维数组里再显示,但要有四个方向,并且越界转向,魔方只一个方向—右上。
效果图:
代码:
import java.util.*;
public class MF {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
System.out.print("请输入数字构建数字旋转魔方:");
int p=input.nextInt();
int n=p;
int[][] a = new int[n][n];//构造二维数组
int x=1;
int d=n;
int q=0;//最开始从最外围一圈开始
while (true) {
if(x>n*n)//如果数字超出,则循环结束
break;
for (int i=q;i<d;i++) {//上行
a[n-d][i]=x++;
}
for (int i=q+1;i<d;i++) {//右列
a[i][d-1] = x++;
}
for (int i=d-2;i>q;i--) {//下行
a[d-1][i]=x++;
}
for (int i=d-1;i>q;i--) {//左列
a[i][q]=x++;
}
q++;
d--;//换成内一圈重新开始
}
for(int[] i:a){
System.out.println();
for(int j:i)
System.out.printf("%5d",j);
}
}
}