java编程之数字魔方(N阶数字魔方和数字旋转魔方)

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);
        }
    }
}

 

  • 7
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
//存为MoFang.java import java.applet.Applet ; import java.awt.*; import com.sun.j3d.utils.applet.MainFrame ; import java.awt.BorderLayout ; import com.sun.j3d.utils.universe.SimpleUniverse ; import javax.media.j3d.*; import javax.vecmath.*; import com.sun.j3d.utils.behaviors.mouse.*; import com.sun.j3d.utils.behaviors.keyboard.*; import com.sun.j3d.utils.picking.behaviors.*; import com.sun.j3d.utils.geometry.*; import com.sun.j3d.utils.image.TextureLoader ; import javax.swing.*; import java.awt.*; import java.awt.event.*; import javax.swing.JFrame.*; import javax.swing.*; class mySimpleUniverse extends Applet { BranchGroup createSceneGraph(Canvas3D canvas) { //System.out.print("**1**"); //创建变换组,无用的t3D Transform3D t3d=new Transform3D(); TransformGroup trans=new TransformGroup(t3d); trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); trans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); //创建分枝组 BranchGroup objRoot=new BranchGroup(); //测试 //SomeShape3D.book3D( this, trans); SomeShape3D.addText3DDonghua(trans,"魔方",new Point3f(-7.0f,6.0f,6.0f),0.1f,new Color3f(1.0f,0.0f,0.0f),1); //初始化数据结构 System.out.println("\n\n载入方块,并向变换组中加入每个方块的坐标系和方块..."); for(int i=0;i<=2;i++) for(int j=0;j<=2;j++) for(int k=0;k<=2;k++) { int[] p; p=Position.getPxyzFromPositionAy(i,j,k,MoFang.positionArray); MoFang.blockArray[i][j][k]=new Block(i,j,k,p[0],p[1],p[2],trans,t3d,objRoot,this); } System.out.println("加入每个方块的坐标系和方块,完成.\n"); //创建大坐标轴,自动加到主坐标系 SomeShape3D.zuoBiaoZhuBigXShape3D(trans); SomeShape3D.zuoBiaoZhuBigYShape3D(trans); SomeShape3D.zuoBiaoZhuBigZShape3D(trans); //创建边界对象 BoundingSphere bounds=new BoundingSphere(new Point3d(0.0,0.0,0.0),100); //创建鼠标pick行为,加到分支组objRoot PickRotateBehavior pickRotate=new PickRotateBehavio

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值