- 注意元素开始输出的位置;
- 总共有输出多少轮:n/2+1
- 每一轮分为上、右、下、左。
- 求每一个方向起始位置与坐标的关系。
import java.util.ArrayList;
import java.util.Scanner;
/*
* 旋转输出矩阵,从中心元素开始,矩阵n*n,n为奇数。
*/
public class rotateOrder {
public ArrayList<Integer> getORder(int[][] array,int n){
ArrayList<Integer> result=new ArrayList<Integer>();
//int startX=n/2,startY=n/2;
//int endX=n-1,endY=n-1;
int i=n/2,j=n/2;
int flag=1;
int temp=n*n;
while(true){
for(j=n/2-(flag-1);j<=n/2+flag-1;j++)//上
{
result.add(array[n/2-flag+1][j]);
temp--;
if(temp==0) break;
}
if(temp==0) break;
for(i=n/2-(flag-1);i<=n/2+flag-1;i++)//右
{
result.add(array[i][n/2+flag]);
temp--;
if(temp==0) break;
}
if(temp==0) break;
for(j=n/2+flag;j>=n/2-flag+1;j--)//下
{
result.add(array[n/2+flag][j]);
temp--;
if(temp==0) break;
}
if(temp==0) break;
for(i=n/2+flag;i>=n/2-flag+1;i--)//左
{
result.add(array[i][n/2-flag]);
temp--;
if(temp==0) break;
}
if(temp==0) break;
flag++;
}
return result;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int a,b;
Scanner sc=new Scanner(System.in);
//a=sc.nextInt();
//b=sc.nextInt();
//System.out.println(a+""+b);
int n=sc.nextInt();
int[][] array=new int[n][n];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
if(sc.hasNextInt())
array[i][j]=sc.nextInt();
}
ArrayList<Integer> al=new ArrayList<Integer>();
rotateOrder ar=new rotateOrder();
al=ar.getORder(array, n);
System.out.println(al.toString());
}
}
>输入为:
5
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
>输出为:
[13, 14, 19, 18, 17, 12, 7, 8, 9, 10, 15, 20, 25, 24, 23, 22, 21, 16, 11, 6, 1, 2, 3, 4, 5]