一维数组和二维数组的跑马灯,随机生成一个随机数,数组的步长为该随机数,一直进行两两交换,直到返回原来的模样。
二维分内圈循环和外圈循环,内圈循环为逆时针,外圈循环为顺时针
import java.util.ArrayList;
import java.util.Arrays;
public class SecondWeek_three {
public static void main(String[] args) {
int n=(int)(Math.random()*3+1);//随机外围步长
System.out.println("外围步长为:"+n);
/*一维跑马灯*/
Integer[] arr=new Integer[40];
Integer[] newArr=new Integer[40];
for(int i=0;i<arr.length;i++) {
arr[i]=i+1;
newArr[i]=i+1;
}
System.out.println("跑马灯前:");
for(int i=0;i<arr.length;i++) {
System.out.print(arr[i]+" ");
}
System.out.println();
runhorselight s1=new runhorselight(arr,newArr, n);
System.out.println("跑马灯后:");
s1.judge();
s1.show();
/*二维跑马灯*/
Integer[][] arr1= {{1,2,3,4},{12,13,14,5},{11,16,15,6},{10,9,8,7}};
Integer[][] arr2 = new Integer[4][4];
for(int i=0;i<4;i++) {
for(int j=0;j<4;j++) {
arr2[i][j]=arr1[i][j];
}
}
runhorselight_doublefour s2=new runhorselight_doublefour(arr1, arr2, n);
s2.judge();
s2.show();
// System.out.println(Arrays.equals(arr1[0], arr2[0]));
}
}
class runhorselight<T>{
T[] arr;
T[] newArr;
int number;
int count=0;
public runhorselight(T[] arr,T[] newArr,int n) {
this.arr=arr;
number=n;
this.newArr=newArr;
}
void change() {
T temp;
for(int i=0;i<arr.length-number;i++) {
temp=arr[i];
arr[i]=arr[i+number];
arr[i+number]=temp;
}
count++;
}
void judge() {
change();
while(Arrays.equals(arr, newArr)!=true) {
change();
}
}
void show() {
for(int i=0;i<arr.length;i++) {
System.out.print(arr[i]+" ");
}
System.out.println();
System.out.println("一共走过"+count+"次");
}
}
class runhorselight_doublefour<T>{
T[][] arr;
T[][] newArr;
int number;
int number_inside=(int)(Math.random()*2+1);
int count=0;
public runhorselight_doublefour(T[][] arr,T[][] newArr,int n) {
this.arr=arr;
number=n;
this.newArr=newArr;
}
void change_outside() {
int change;
int changefirst,changesecond;
int i=0,j=0;
do
{
T temp=arr[i][j];
if(i==0 && j!=3) {
change=j+number;
if(change>3) {
changesecond=3;
changefirst=change-changesecond;
arr[i][j]=arr[changefirst][changesecond];
arr[changefirst][changesecond]=temp;
}
else {
arr[i][j]=arr[i][j+number];
arr[i][j+number]=temp;
}
count++;
j++;
}
else if(i!=3 && j==3) {
change=i+number;
if(change>3) {
changefirst=3;
changesecond=change-j;
arr[i][j]=arr[changefirst][3-changesecond];
arr[changefirst][3-changesecond]=temp;
}
else {
arr[i][j]=arr[i+number][j];
arr[i+number][j]=temp;
}
count++;
i++;
}
else if(i==3 && j!=0) {
change=j-number;
if(change>0) {
arr[i][j]=arr[i][change];
arr[i][change]=temp;
}
else {
changesecond=0;
arr[i][j]=arr[i+change][changesecond];
arr[i+change][changesecond]=temp;
}
count++;
j--;
}
else{
change=i-number;
if(change>0) {
arr[i][j]=arr[change][j];
arr[change][j]=temp;
}
else {
changefirst=0;
arr[i][j]=arr[changefirst][-change];
arr[changefirst][-change]=temp;
}
count++;
i--;
}
}while(Arrays.equals(arr[0], newArr[0])!=true);
}
void change_inside() {//内圈每次步长为1或2
int i=1,j=1;
int change;
System.out.println("内圈步长:"+number_inside);
do {
T temp=arr[i][j];
if(j==1 && i==1) {
change=i+number_inside;
if(change==2) {
arr[i][j]=arr[i+1][j];
arr[i+1][j]=temp;
}
else {
arr[i][j]=arr[i+1][j+1];
arr[i+1][j+1]=temp;
}
count++;
i++;
}
else if(i==2 && j==1) {
change=j+number_inside;
if(change==2) {
arr[i][j]=arr[i][j+1];
arr[i][j+1]=temp;
}
else {
arr[i][j]=arr[i-1][j+1];
arr[i-1][j+1]=temp;
}
count++;
j++;
}
else if(i==2 && j==2) {
change=2-number_inside;
if(change==1) {
arr[i][j]=arr[i-1][j];
arr[i-1][j]=temp;
}
else {
arr[i][j]=arr[i-1][j-1];
arr[i-1][j-1]=temp;
}
count++;
i--;
}
else {
change=j-number_inside;
if(change==1) {
arr[i][j]=arr[i][j-1];
arr[i][j-1]=temp;
}
else {
arr[i][j]=arr[i+1][j-1];
arr[i+1][j-1]=temp;
}
count++;
j--;
}
}while(Arrays.equals(arr[1], newArr[1])!=true);
}
void judge() {
change_outside();
change_inside();
}
void show() {
for(int i=0;i<4;i++) {
for(int j=0;j<4;j++) {
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
System.out.println("out-circle has run "+count+" times!");
}
}