Running Lamp

数据结构之数组–Running Lamp问题
移动一维数组:要求每次移动3个数据,直到数组恢复原状
代码实现:

public static void main(String[] args) {
	int[] Origin = new int[19];
	int[] Run = new int[19];
	int index = 1;
	for(int i=0;i<Origin.length;i++) {
		Origin[i] = index;
		index++;
	}
	for(int i=0;i<Run.length;i++) {
		Run[i] = Origin[i];
	}
	//为了使Run数组进入下面的while循环,先在外面进行一次移动
	int n=3;
	int[] temp = new int[n];//temp数组保存每次移动后被覆盖的数
	for(int i=0;i<n;i++) {
		temp[i] = Run[Run.length-(i+1)];
	}
	int j=Run.length-n-1;
	//将数组进行移动
	for(int i=Run.length-1;i>2;i--) {
		Run[i] = Run[j];
		j--;
	}
	//将被覆盖的数放在数组空出来的位置
	for(int i=0;i<n;i++) {
		Run[i] = temp[n-(i+1)];
	}
	for(int i=0;i<Run.length;i++) {
		System.out.printf("%d ",Run[i]);
	}
	System.out.print("\n");
	//开始Run数组的移动,每次移动都进行输出,直到回到原来的数组
	while(Arrays.equals(Origin,Run)==false) {
		for(int i=0;i<n;i++) {
			temp[i] = Run[Run.length-(i+1)];
		}
		int k=Run.length-n-1;
		for(int i=Run.length-1;i>2;i--) {
			Run[i] = Run[k];
			k--;
		}
		for(int i=0;i<n;i++) {
			Run[i] = temp[n-(i+1)];
		}
		for(int i=0;i<Run.length;i++) {
			System.out.printf("%d ",Run[i]);
		}
		System.out.print("\n");
	}
}
输出结果:
17 18 19 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 
14 15 16 17 18 19 1 2 3 4 5 6 7 8 9 10 11 12 13 
11 12 13 14 15 16 17 18 19 1 2 3 4 5 6 7 8 9 10 
8 9 10 11 12 13 14 15 16 17 18 19 1 2 3 4 5 6 7 
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 1 2 3 4 
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 1 
18 19 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 
15 16 17 18 19 1 2 3 4 5 6 7 8 9 10 11 12 13 14 
12 13 14 15 16 17 18 19 1 2 3 4 5 6 7 8 9 10 11 
9 10 11 12 13 14 15 16 17 18 19 1 2 3 4 5 6 7 8 
6 7 8 9 10 11 12 13 14 15 16 17 18 19 1 2 3 4 5 
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 1 2 
19 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 
16 17 18 19 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 
13 14 15 16 17 18 19 1 2 3 4 5 6 7 8 9 10 11 12 
10 11 12 13 14 15 16 17 18 19 1 2 3 4 5 6 7 8 9 
7 8 9 10 11 12 13 14 15 16 17 18 19 1 2 3 4 5 6 
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 1 2 3 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 

移动二维数组:要求先移动最外层的数据,然后移动第二层的数据,然后移动最里层的数据,直到恢复原状
移动二维数组与移动一维数组的思想大致相同,只不过多了一步将二维数组拆分为一维数组的过程
代码实现:

	public static void main(String[] args) {
	int[][] arr = new int[6][6];
	int index = 1;
	for(int j=0;j<6;j++) {
		for(int i=0;i<6;i++) {
			arr[i][j] = index;
			index++;
		}
	}
	//将第三层的数据用一个一维数组保存起来
	int[] layer3 = new int[20];
	for(int i=0;i<6;i++) {
		layer3[i] = arr[i][0];
	}
	int j1=1;
	for(int i=6;i<11;i++) {
		layer3[i] = arr[5][j1];
		j1++;
	}
	int i1=4;
	for(int i=11;i<16;i++) {
		layer3[i] = arr[i1][5];
		i1--;
	}
	int j2=4;
	for(int i=16;i<20;i++) {
		layer3[i] = arr[0][j2];
		j2--;
	}
	//将第二层的数据用一个一维数组保存起来
	int[] layer2 = new int[12];
	int i2=1;
	for(int i=0;i<4;i++) {
		layer2[i] = arr[i2][1];
		i2++;
	}
	int j3=2;
	for(int i=4;i<7;i++) {
		layer2[i] = arr[4][j3];
		j3++;
	}
	int i3=4;
	for(int i=7;i<10;i++) {
		layer2[i] = arr[i3][4];
		i3--;
	}
	int j4=3;
	for(int i=10;i<12;i++) {
		layer2[i] = arr[1][j4];
		j4--;
	}
	//将第一层的数据用一个一维数组保存起来
	int[] layer1 = new int[4];
	int i4=2;
	for(int i=0;i<2;i++) {
		layer1[i] = arr[i4][2];
		i4++;
	}
	int i5=3;
	for(int i=2;i<4;i++) {
		layer1[i] = arr[i5][3];
		i5--;
	}
	//创建一个变化的数组
	int[][] arrrun = new int[6][6];
	for(int j=0;j<6;j++) {
		for(int i=0;i<6;i++) {
			arrrun[i][j] = arr[i][j];
		}
	}
	//复制layer3以作比较
	int[] layer3copy = new int[20];
	for(int i=0;i<20;i++) {
		layer3copy[i] = layer3[i];
	}
	//先进行一次移动,以进入后面的while语句
	move(layer3);
	for(int i=0;i<6;i++) {
		arrrun[i][0] = layer3[i];
	}
	j1=1;
	for(int i=6;i<11;i++) {
		arrrun[5][j1] = layer3[i];
		j1++;
	}
	i1=4;
	for(int i=11;i<16;i++) {
		arrrun[i1][5] = layer3[i];
		i1--;
	}
	j2=4;
	for(int i=16;i<20;i++) {
		arrrun[0][j2] = layer3[i];
		j2--;
	}
	for(int j=0;j<6;j++) {
		for(int i=0;i<6;i++) {
			if(i==5) {
				System.out.printf("%d ",arrrun[i][j]);
				System.out.printf("\n");
			}
			else {
				System.out.printf("%d ",arrrun[i][j]);
			}
		}
	}
	while(Arrays.equals(layer3,layer3copy) == false) {
		move(layer3);
		for(int i=0;i<6;i++) {
			arrrun[i][0] = layer3[i];
		}
		j1=1;
		for(int i=6;i<11;i++) {
			arrrun[5][j1] = layer3[i];
			j1++;
		}
		i1=4;
		for(int i=11;i<16;i++) {
			arrrun[i1][5] = layer3[i];
			i1--;
		}
		j2=4;
		for(int i=16;i<20;i++) {
			arrrun[0][j2] = layer3[i];
			j2--;
		}
		for(int j=0;j<6;j++) {
			for(int i=0;i<6;i++) {
				if(i==5) {
					System.out.printf("%d ",arrrun[i][j]);
					System.out.print("\n");
				}
				else {
					System.out.printf("%d ",arrrun[i][j]);
				}
			}
		}
	}
	System.out.println("第三层移动完毕");
	//第二层和第一层的做法同第三层
	int[] layer2copy = new int[12];
	for(int i=0;i<12;i++) {
		layer2copy[i] = layer2[i];
	}
	move(layer2);
	i2=1;
	for(int i=0;i<4;i++) {
		arrrun[i2][1] = layer2[i];
		i2++;
	}
	j3=2;
	for(int i=4;i<7;i++) {
		arrrun[4][j3] = layer2[i];
		j3++;
	}
	i3=4;
	for(int i=7;i<10;i++) {
		arrrun[i3][4] = layer2[i];
		i3--;
	}
	j4=3;
	for(int i=10;i<12;i++) {
		arrrun[1][j4] = layer2[i];
		j4--;
	}
	for(int j=0;j<6;j++) {
		for(int i=0;i<6;i++) {
			if(i==5) {
				System.out.printf("%d ",arrrun[i][j]);
				System.out.print("\n");
			}
			else {
				System.out.printf("%d ",arrrun[i][j]);
			}
		}
	}
	while(Arrays.equals(layer2,layer2copy) == false) {
		move(layer2);
		i2=1;
		for(int i=0;i<4;i++) {
			arrrun[i2][1] = layer2[i];
			i2++;
		}
		j3=2;
		for(int i=4;i<7;i++) {
			arrrun[4][j3] = layer2[i];
			j3++;
		}
		i3=4;
		for(int i=7;i<10;i++) {
			arrrun[i3][4] = layer2[i];
			i3--;
		}
		j4=3;
		for(int i=10;i<12;i++) {
			arrrun[1][j4] = layer2[i];
			j4--;
		}
		for(int j=0;j<6;j++) {
			for(int i=0;i<6;i++) {
				if(i==5) {
					System.out.printf("%d ",arrrun[i][j]);
					System.out.print("\n");
				}
				else {
					System.out.printf("%d ",arrrun[i][j]);
				}
			}
		}
	}
	System.out.println("第二层移动完毕");
	int[] layer1copy = new int[4];
	for(int i=0;i<4;i++) {
		layer1copy[i] = layer1[i];
	}
	move(layer1);
	i4=2;
	for(int i=0;i<2;i++) {
		arrrun[i4][2] = layer1[i];
		i4++;
	}
	i5=3;
	for(int i=2;i<4;i++) {
		arrrun[i5][3] = layer1[i];
		i5--;
	}
	for(int j=0;j<6;j++) {
		for(int i=0;i<6;i++) {
			if(i==5) {
				System.out.printf("%d ",arrrun[i][j]);
				System.out.print("\n");
			}
			else {
				System.out.printf("%d ",arrrun[i][j]);
			}
		}
	}
	while(Arrays.equals(layer1,layer1copy) == false) {
		move(layer1);
		i4=2;
		for(int i=0;i<2;i++) {
			arrrun[i4][2] = layer1[i];
			i4++;
		}
		i5=3;
		for(int i=2;i<4;i++) {
			arrrun[i5][3] = layer1[i];
			i5--;
		}
		for(int j=0;j<6;j++) {
			for(int i=0;i<6;i++) {
				if(i==5) {
					System.out.printf("%d ",arrrun[i][j]);
					System.out.print("\n");
				}
				else {
					System.out.printf("%d ",arrrun[i][j]);
				}
			}
		}
	}
	System.out.println("第一层移动完毕");
}
public static void move(int layer[]) {
	int n=1;
	int[] temp = new int[n];//temp数组保存每次移动后被覆盖的数
	for(int i=0;i<n;i++) {
		temp[i] = layer[layer.length-(i+1)];
	}
	int j=layer.length-n-1;
	//将数组进行移动
	for(int i=layer.length-1;i>(n-1);i--) {
		layer[i] = layer[j];
		j--;
	}
	//将被覆盖的数放在数组空出来的位置
	for(int i=0;i<n;i++) {
		layer[i] = temp[n-(i+1)];
	}
}
输出结果:
7 1 2 3 4 5 
13 8 9 10 11 6 
19 14 15 16 17 12 
25 20 21 22 23 18 
31 26 27 28 29 24 
32 33 34 35 36 30 
13 7 1 2 3 4 
19 8 9 10 11 5 
25 14 15 16 17 6 
31 20 21 22 23 12 
32 26 27 28 29 18 
33 34 35 36 30 24 
19 13 7 1 2 3 
25 8 9 10 11 4 
31 14 15 16 17 5 
32 20 21 22 23 6 
33 26 27 28 29 12 
34 35 36 30 24 18 
25 19 13 7 1 2 
31 8 9 10 11 3 
32 14 15 16 17 4 
33 20 21 22 23 5 
34 26 27 28 29 6 
35 36 30 24 18 12 
31 25 19 13 7 1 
32 8 9 10 11 2 
33 14 15 16 17 3 
34 20 21 22 23 4 
35 26 27 28 29 5 
36 30 24 18 12 6 
32 31 25 19 13 7 
33 8 9 10 11 1 
34 14 15 16 17 2 
35 20 21 22 23 3 
36 26 27 28 29 4 
30 24 18 12 6 5 
33 32 31 25 19 13 
34 8 9 10 11 7 
35 14 15 16 17 1 
36 20 21 22 23 2 
30 26 27 28 29 3 
24 18 12 6 5 4 
34 33 32 31 25 19 
35 8 9 10 11 13 
36 14 15 16 17 7 
30 20 21 22 23 1 
24 26 27 28 29 2 
18 12 6 5 4 3 
35 34 33 32 31 25 
36 8 9 10 11 19 
30 14 15 16 17 13 
24 20 21 22 23 7 
18 26 27 28 29 1 
12 6 5 4 3 2 
36 35 34 33 32 31 
30 8 9 10 11 25 
24 14 15 16 17 19 
18 20 21 22 23 13 
12 26 27 28 29 7 
6 5 4 3 2 1 
30 36 35 34 33 32 
24 8 9 10 11 31 
18 14 15 16 17 25 
12 20 21 22 23 19 
6 26 27 28 29 13 
5 4 3 2 1 7 
24 30 36 35 34 33 
18 8 9 10 11 32 
12 14 15 16 17 31 
6 20 21 22 23 25 
5 26 27 28 29 19 
4 3 2 1 7 13 
18 24 30 36 35 34 
12 8 9 10 11 33 
6 14 15 16 17 32 
5 20 21 22 23 31 
4 26 27 28 29 25 
3 2 1 7 13 19 
12 18 24 30 36 35 
6 8 9 10 11 34 
5 14 15 16 17 33 
4 20 21 22 23 32 
3 26 27 28 29 31 
2 1 7 13 19 25 
6 12 18 24 30 36 
5 8 9 10 11 35 
4 14 15 16 17 34 
3 20 21 22 23 33 
2 26 27 28 29 32 
1 7 13 19 25 31 
5 6 12 18 24 30 
4 8 9 10 11 36 
3 14 15 16 17 35 
2 20 21 22 23 34 
1 26 27 28 29 33 
7 13 19 25 31 32 
4 5 6 12 18 24 
3 8 9 10 11 30 
2 14 15 16 17 36 
1 20 21 22 23 35 
7 26 27 28 29 34 
13 19 25 31 32 33 
3 4 5 6 12 18 
2 8 9 10 11 24 
1 14 15 16 17 30 
7 20 21 22 23 36 
13 26 27 28 29 35 
19 25 31 32 33 34 
2 3 4 5 6 12 
1 8 9 10 11 18 
7 14 15 16 17 24 
13 20 21 22 23 30 
19 26 27 28 29 36 
25 31 32 33 34 35 
1 2 3 4 5 6 
7 8 9 10 11 12 
13 14 15 16 17 18 
19 20 21 22 23 24 
25 26 27 28 29 30 
31 32 33 34 35 36 
第三层移动完毕
1 2 3 4 5 6 
7 14 8 9 10 12 
13 20 15 16 11 18 
19 27 21 22 17 24 
25 26 28 29 29 30 
31 32 33 34 35 36 
1 2 3 4 5 6 
7 20 14 8 9 12 
13 27 15 16 10 18 
19 28 21 22 11 24 
25 26 29 29 23 30 
31 32 33 34 35 36 
1 2 3 4 5 6 
7 27 20 14 8 12 
13 28 15 16 9 18 
19 29 21 22 10 24 
25 26 29 23 17 30 
31 32 33 34 35 36 
1 2 3 4 5 6 
7 28 27 20 14 12 
13 29 15 16 8 18 
19 29 21 22 9 24 
25 26 23 17 11 30 
31 32 33 34 35 36 
1 2 3 4 5 6 
7 29 28 27 20 12 
13 29 15 16 14 18 
19 23 21 22 8 24 
25 26 17 11 10 30 
31 32 33 34 35 36 
1 2 3 4 5 6 
7 29 29 28 27 12 
13 23 15 16 20 18 
19 17 21 22 14 24 
25 26 11 10 9 30 
31 32 33 34 35 36 
1 2 3 4 5 6 
7 23 29 29 28 12 
13 17 15 16 27 18 
19 11 21 22 20 24 
25 26 10 9 8 30 
31 32 33 34 35 36 
1 2 3 4 5 6 
7 17 23 29 29 12 
13 11 15 16 28 18 
19 10 21 22 27 24 
25 26 9 8 14 30 
31 32 33 34 35 36 
1 2 3 4 5 6 
7 11 17 23 29 12 
13 10 15 16 29 18 
19 9 21 22 28 24 
25 26 8 14 20 30 
31 32 33 34 35 36 
1 2 3 4 5 6 
7 10 11 17 23 12 
13 9 15 16 29 18 
19 8 21 22 29 24 
25 26 14 20 27 30 
31 32 33 34 35 36 
1 2 3 4 5 6 
7 9 10 11 17 12 
13 8 15 16 23 18 
19 14 21 22 29 24 
25 26 20 27 28 30 
31 32 33 34 35 36 
1 2 3 4 5 6 
7 8 9 10 11 12 
13 14 15 16 17 18 
19 20 21 22 23 24 
25 26 27 28 29 30 
31 32 33 34 35 36 
第二层移动完毕
1 2 3 4 5 6 
7 8 9 10 11 12 
13 14 21 15 17 18 
19 20 22 16 23 24 
25 26 27 28 29 30 
31 32 33 34 35 36 
1 2 3 4 5 6 
7 8 9 10 11 12 
13 14 22 21 17 18 
19 20 16 15 23 24 
25 26 27 28 29 30 
31 32 33 34 35 36 
1 2 3 4 5 6 
7 8 9 10 11 12 
13 14 16 22 17 18 
19 20 15 21 23 24 
25 26 27 28 29 30 
31 32 33 34 35 36 
1 2 3 4 5 6 
7 8 9 10 11 12 
13 14 15 16 17 18 
19 20 21 22 23 24 
25 26 27 28 29 30 
31 32 33 34 35 36 
第一层移动完毕

由此可以想象到移动三层数组的情况:先拆分为二维数组,才拆分为一维数组进行移动。原理大致相同,但每增加一维,代码量都成几何倍数增长,所以很麻烦。(其实是我懒)

此次记录到此结束。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值