/*
* 3.跑马灯(归位时结束)
一维:
数组总长自己定,步长随机,例如步长是2时就1和3交换,2和4交换
二维(算法时间复杂度是0(n^2)):
选用3*3或4*4或5*5的矩阵从外层开始顺逆轮流地旋转,旋转的步长是随机数,是外圈转一次,再到内圈也转一次,直到所有数都经过旋转后归位.
三维:
旋转三层的魔方
以魔方中心为原点建立空间直角坐标系,每一个小格子存放一个数据,一共 26 个数据,输入参数,确定是要绕哪个轴旋转,旋转多少格
*/
package second;

public class HorseRaceLamp
{
public static void main(String[] args)
{
HorseRaceLamp hrl = new HorseRaceLamp();
System.out.println("一维数组");
Integer a[] = new Integer[5];
for(int x=0;x<a.length;x++)
{
a[x]=x+1;
}
System.out.println("原本的样子:");
hrl.showFirst(a);
System.out.println("转换后的");
hrl.First(a);

System.out.println("二维数组");
Object b[][]=new Object[4][4];
b=hrl.CreateArray(4);
hrl.ShowArray(b);

System.out.println("三维数组(转到魔方为例),需要输入三个参数:"
+ "\n垂直哪个轴转(1代表x,2代表y,3代表z)\n第几层转\n转几圈");
hrl.Turn(0, 0, 0);

}

//魔方转动
public void Turn(int Axis,int floor,int cricle)
{
int a[][][]=new int[3][3][3];
int count=1;
for(int x=0;x<3;x++)
{
for(int y=0;y<3;y++)
{
for(int z=0;z<3;z++)
{
a[x][y][z]=count++;
}
}
}

int b[][][]=new int[3][3][3];
count=1;
for(int x=0;x<3;x++)
{
for(int y=0;y<3;y++)
{
for(int z=0;z<3;z++)
{
b[x][y][z]=count++;
}
}
}

System.out.println("原本魔方的样子");
ShowThird(a);

}
//显示魔方的样子
public void ShowThird(int[][][] a)
{
for(int x=0;x<3;x++)
{
for(int y=0;y<3;y++)
{
for(int z=0;z<3;z++)
{
System.out.printf("%-4d",a[x][y][z]);
}
System.out.println();
}
System.out.println();
}
}

//实现二维数组的跑马灯
public <T> void second(T[] a)
{

}
//复制二维数组
public <T> T[][] CopySecond(T[][] a)
{
Object b[][]=new Object[a.length][];
for(int x=0;x<a.length;x++)
{
b[x]=new Object[a[x].length];
for(int y=0;y<a[x].length;y++)
{

b[x][y]=a[x][y];
}
}
return (T[][]) b;
}

//显示二维数组
public <T>void ShowArray( T[][] b)
{
for(int x=0;x<b.length;x++)
{
for (int y=0;y<b[x].length;y++)
{
System.out.printf("%-4d",b[x][y]);
}
System.out.println();
}
}
//创建一个二维的跑马灯
public <T> T[][] CreateArray(int size)
{
Object a[][]=new Object[size][size];
int floor,FloorUp,FloorRight,FloorDown,FloorLeft,count=1;
for(floor=0;floor<size;floor++)
{
FloorRight=floor;
for(FloorUp=floor;FloorUp<size-floor;FloorUp++)
{
a[floor][FloorUp]=count++;
}
for(FloorRight+=1;FloorRight<size-floor;FloorRight++)
{
a[FloorRight][size-floor-1]=count++;
}
for(FloorDown=size-2-floor;FloorDown>=floor;FloorDown--)
{
a[size-floor-1][FloorDown]=count++;
}
for(FloorLeft=size-floor-2;FloorLeft>floor;FloorLeft--)
{
a[FloorLeft][floor]=count++;
}
if(count==size*size+1)
{
break;
}
}
return (T[][])a;
}
//对比二维数组是否相等
public <T> boolean compare2(T[][] a,T[][] b)
{
boolean falg=true;
if(a.length!=b.length)
return false;
for(int x=0;x<a.length;x++)
{
if(a[x].length!=b[x].length)
{
falg=false;break;
}
}
for(int x=0;x<a.length;x++)
{
for(int y=0;y<a[x].length;y++)
{
if(!(a[x][y].equals(b[x][y])))
{
falg=false;
}
}
}
return falg;
}



//一维数组的跑马灯方法一
public <T> void First(T[] a)
{
//随机产生比数组长度小1的大于0的整数,因为a.length-1是最大的步长
int MyRabdom = (int) (Math.random() * (a.length-1) + 1);
System.out.println("步长是:"+MyRabdom);
//b用来存储,c用来比较
Object b[]=new Object[a.length];
Object c[]=new Object[a.length];
b=Copy(a);
c=Copy(a);
int x=0;
while(true)
{
for(int y=0;y<a.length;y++)
{
b[(x+MyRabdom)%a.length]=a[x%a.length];
x++;
}
if(compare1(b, c))
break;
showFirst(b);
a=(T[]) Copy(b);
x++;
}
showFirst(b);

}
//一维数组的跑马灯方法二
public <T> void first(T[] a)
{
//随机产生比数组长度小1的大于0的整数,因为a.length-1是最大的步长
int MyRabdom = (int) (Math.random() * (a.length-1) + 1);
System.out.println("步长是:"+MyRabdom);
int x=0;
T temp=null;
Object b[]=new Object[a.length];
for(int copy=0;copy<a.length;copy++)
{
b[copy]=a[copy];
}
while(true)
{
temp=a[x%a.length];
a[x%a.length]=a[(x+MyRabdom)%a.length];
a[(x+MyRabdom)%a.length]=temp;
x++;
for(int copy=0;copy<a.length;copy++)
{
System.out.print(a[copy]+" ");
}
System.out.println();
if(compare1(a, b))
{
break;
}
}
}

//复制一维数组
public <T> T[] Copy(T[] a)
{
Object b[]=new Object[a.length];
for(int copy=0;copy<a.length;copy++)
{
b[copy]=a[copy];
}
return (T[]) b;
}
//显示一维的数组
public <T>void showFirst(T[] a)
{
for(int x=0;x<a.length;x++)
{
System.out.print(a[x]+" ");
}
System.out.println();
}
//比较一维的两个数组是否相等
public<T> boolean compare1(T[] a,T[] b)
{
if(a.length!=b.length)
return false;
boolean falg=true;
for(int i=0;i<a.length;i++)
{
if(!(a[i].equals(b[i])))
{
falg=false;break;
}
}
return falg;
}
}