一维:
一维跑马灯:步长在[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();
}
}
}
}