Java实现三个维度的跑马灯(数组)

一维:

一维跑马灯:步长在[3,5,8,13]中重复的循环右移,直至回到原始状态。

Java代码:

import java.util.Arrays;
public class Marquee1 {
    public static void main(String[] args) {
        int[] arr = new int[10];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = i;
        }
        marqueeMove(arr);
    }
    //数组移动,步长为1
    public static void move(int[] a) {
        int temp = a[a.length - 1];
        for (int i = a.length - 1; i > 0; i--) {
            a[i] = a[i - 1];
        }
        a[0] = temp;
    }
    //
    //按步长依次为3,5,8,13移动,直到回到原来的数组
    public static void marqueeMove(int[] a) {
        int[] temp = new int[a.length];
        for (int i = 0; i < a.length; i++) {
            temp[i] = a[i];
        }
        while (true) {
            //步长为3的移动
            for (int i = 0; i < 3; i++) {
                move(a);
            }
            System.out.print(3);
            if (Arrays.equals(temp,a)) {
                System.out.println(Arrays.equals(temp,a));
                return;
            }
            //步长为5的移动
            for (int i = 0; i < 5; i++) {
                move(a);
            }
            System.out.print(5);
            if (Arrays.equals(temp,a)) break;
            //步长为8的移动
            for (int i = 0; i < 8; i++) {
                move(a);
            }
            System.out.print(8);
            if (Arrays.equals(temp,a)) break;
        }
    }
}

二维:

二维跑马灯:6×6的二维数组,外圈顺时针,中圈逆时针,内圈顺时针,步长为1的移动。直至回到初始状态。

Java代码:

import java.util.Random;
public class Marquee2 {
    public static void main(String[] args) {
        Random random = new Random();
        int[][] arr = new int[6][6];
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                arr[i][j] = random.nextInt(10);
            }
        }
        look(arr);
        for (int i = 0; i < 20; i++) {
            move1(arr);
        }
        for (int i = 0; i < 12; i++) {
            move2(arr);
        }
        for (int i = 0; i < 4; i++) {
            move3(arr);
        }
    }
    //顺时针移动数组最外层,步长为1
    public static void move1(int[][] a) {
        //把第一行最后一个元素保存下来
        int temp = a[0][a[0].length - 1];
        //最外层第一行往右移动一位
        for (int i = a[0].length - 1; i > 0; i--) {
            a[0][i] = a[0][i - 1];
        }
        //最外层第一列往上移动一位
        for (int i = 1; i < a.length; i++) {
            a[i - 1][0] = a[i][0];
        }
        //最外层最后一行往左移动一位
        for (int i = 1; i < a[a.length - 1].length; i++) {
            a[a.length - 1][i - 1] = a[a.length - 1][i];
        }
        //最外层最后一列往下移动一位,注意在第一行的那个元素不能移动
        for (int i = a.length - 1; i > 1; i--) {
            a[i][a.length - 1] = a[i - 1][a.length - 1];
        }
        a[1][a.length - 1] = temp;
        look(a);
    }

    //次外层逆时针移动,步长为1
    public static void move2(int[][] a) {
        //把第二行第二个元素保存下来
        int temp = a[1][1];
        //次外层第一行往左移动一位
        for (int i = 2; i < a.length - 1; i++) {
            a[1][i - 1] = a[1][i];
        }
        //次外层最后一列往上移动一位
        for (int i = 2; i < a.length - 1; i++) {
            a[i - 1][a.length - 2] = a[i][a.length - 2];
        }
        //次外层最后一行往右移动一位
        for (int i = a.length - 2; i > 1; i--) {
            a[a.length - 2][i] = a[a.length - 2][i - 1];
        }
        //次外层第一列往下移动一位,注意此外层的第一行和第一列不能移动
        for (int i = a.length - 2; i > 2 ; i--) {
            a[i][1] = a[i - 1][1];
        }
        a[2][1] = temp;
        look(a);
    }

    //最内层顺时针移动,步长为1
    public static void move3(int[][] a) {
        int temp = a[2][3];
        a[2][3] = a[2][2];
        a[2][2] = a[3][2];
        a[3][2] = a[3][3];
        a[3][3] = temp;
        look(a);
    }
    //打印二维数组
    public static void look(int[][] a) {
        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < a[i].length; j++) {
                System.out.print(a[i][j] + "  ");
            }
            System.out.println();
        }
        System.out.println("------------------");
    }
}

三维:

三维:类似333的魔方。输入诸如2,1,3的数字,表示当x不变时,yoz平面(共有三个)上的内容进行一次循环移动步长为2;y不变时,xoz平面(也是三个)的内容进行一次步长为1的循环位移;以及当z不变时,xoy平面上的内容进行一次步长为3的循环移动。

Java代码:

import java.util.Random;
public class Marquee3 {
    public static void main(String[] args) {
        Random random = new Random();
        int[][][] arr = new int[3][3][3];
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                for (int k = 0; k < 3; k++) {
                    arr[i][j][k] = random.nextInt(10);
                }
            }
        }
        marquee3(arr, 1, 1, 1);
    }
    public static void marquee3(int[][][] a, int a1, int a2, int a3) {

        look(a);
        //xoy转动a1次
        for (int i = 0; i < a1; i++) {
            move1(a[0]);
        }
        //xoz转动a2次
        for (int i = 0; i < a2; i++) {
            move2(a);
        }
        //yoz转动a3次
        for (int i = 0; i < a3; i++) {
            move3(a);
        }
        look(a);
    }
    //二维数组的移动,xoy平面的移动
    public static void move1(int[][] a) {
        //把第一行最后一个元素保存下来
        int temp = a[0][a[0].length - 1];
        //最外层第一行往右移动一位
        for (int i = a[0].length - 1; i > 0; i--) {
            a[0][i] = a[0][i - 1];
        }
        //最外层第一列往上移动一位
        for (int i = 1; i < a.length; i++) {
            a[i - 1][0] = a[i][0];
        }
        //最外层最后一行往左移动一位
        for (int i = 1; i < a[a.length - 1].length; i++) {
            a[a.length - 1][i - 1] = a[a.length - 1][i];
        }
        //最外层最后一列往下移动一位,注意在第一行的那个元素不能移动
        for (int i = a.length - 1; i > 1; i--) {
            a[i][a.length - 1] = a[i - 1][a.length - 1];
        }
        a[1][a.length - 1] = temp;
        
    }

    //正视第一层的转动,xoz平面
    public static void move2(int[][][] a) {
        //把正视第一层转换成一个二维数组,移动后再赋回原来数组
        int[][] temp = new int[a.length][a.length];
        for (int i = 0; i < temp.length; i++) {
            for (int j = 0; j < temp.length; j++) {
                temp[i][j] = a[i][a.length - 1][j];
            }
        }
        move1(temp);
        for (int i = 0; i < temp.length; i++) {
            for (int j = 0; j < temp.length; j++) {
                a[i][a.length - 1][j] = temp[i][j];
            }
        }
    }

    //右视第一层的转动,yoz平面
    public static void move3(int[][][] a) {
        int[][] temp = new int[a.length][a.length];
        for (int i = 0; i < temp.length; i++) {
            for (int j = 0; j < temp.length; j++) {
                temp[i][j] = a[i][a.length - j - 1][a.length - 1];
            }
        }
        move1(temp);
        for (int i = 0; i < temp.length; i++) {
            for (int j = 0; j < temp.length; j++) {
                a[i][a.length - j - 1][a.length - 1] = temp[i][j];
            }
        }
    }

    //打印查看三维数组
    public static void look(int[][][] a) {
        for (int i = 0; i < 3; i++) {
            System.out.println("第" + (i + 1) + "个二维数组");
            for (int j = 0; j < 3; j++) {
                for (int k = 0; k < 3; k++) {
                    System.out.print(a[i][j][k] + " ");
                }
                System.out.println();
            }
        }
    }
}
  • 6
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值