题目描述
对于一个矩阵,请设计一个算法从左上角(mat[0][0])开始,顺时针打印矩阵元素。
给定int矩阵mat,以及它的维数nxm,请返回一个数组,数组中的元素为矩阵元素的顺时针输出。
测试样例:
[[1,2],[3,4]],2,2
返回:[1,2,4,3]
public static void main(String[] args) {
int m = 5;
int n = 7;
int mat [][] = new int[n][m];
int temp = 0;
for (int a = 0 ; a < n;a++){
for(int j = 0; j < m; j++){
mat[a][j] = temp;
System.out.print(temp+"\t");
temp++;
}
System.out.println();
}
calc(mat,n,m);
}
public static void calc(int[][] mat, int n, int m){//m 列 n行
List<Integer> lists = new ArrayList<Integer>();
class Point{
int x;
int y;
public Point(int x,int y){
this.x = x;
this.y = y;
}
}
List<Point> up_left = new ArrayList<Point>();
List<Point> up_right = new ArrayList<Point>();
List<Point> down_left = new ArrayList<Point>();
List<Point> down_right = new ArrayList<Point>();
//如果 矩阵是胖的 或者是正方形 ,就是行数 小于 列数,或者 行数等于 列数
if(m >= n){
int row = n%2 == 1?n/2+1:n/2;
int row_down = n/2;
for (int i = 0 ; i < row ; i++){
up_left.add(new Point(i,i));
up_right.add(new Point(i,m-1-i));
}
for(int i = 0 ; i < row_down ; i++){
down_left.add(new Point(n-1-i,i));
down_right.add(new Point(n-1-i,m-1-i));
}
for (int i = 0 ; i < up_left.size() ; i++){
Point upleft = up_left.get(i);
Point upright = up_right.get(i);
Point downleft = null;
Point downright = null;
if(i <= row_down - 1){
downleft = down_left.get(i);
downright = down_right.get(i);
}
for(int a = upleft.y;a <= upright.y ; a++){
lists.add(mat[upleft.x][a]);
System.out.print(mat[upleft.x][a]+"\t");
}
if(downleft != null){
for(int a = upright.x+1;a <= downright.x ; a++){
lists.add(mat[a][upright.y]);
System.out.print(mat[a][upright.y]+"\t");
}
for(int a = downright.y-1;a >= downleft.y ; a--){
lists.add(mat[downright.x][a]);
System.out.print(mat[downright.x][a]+"\t");
}
for(int a = downleft.x-1;a >= upleft.x+1 ; a--){
lists.add(mat[a][downleft.y]);
System.out.print(mat[a][downleft.y]+"\t");
}
}
}
}
//是瘦的 行数大于列数
else{
int col = m%2 == 1?m/2+1:m/2;
int col_down = m/2;
for (int i = 0 ; i < col ; i++){
up_left.add(new Point(i,i));
down_left.add(new Point(n-1-i,i));
}
for(int i = 0 ; i < col_down ; i++){
up_right.add(new Point(i,m-1-i));
down_right.add(new Point(n-1-i,m-1-i));
}
for (int i = 0 ; i < up_left.size(); i++){
Point upleft = up_left.get(i);
Point downleft = down_left.get(i);
Point upright = null;
Point downright = null;
if(i <= col_down - 1){
upright = up_right.get(i);
downright = down_right.get(i);
}
if(upright != null){
for(int a = upleft.y;a <= upright.y ; a++){
lists.add(mat[upleft.x][a]);
System.out.print(mat[upleft.x][a]+"\t");
}
for(int a = upright.x+1;a <= downright.x ; a++){
lists.add(mat[a][upright.y]);
System.out.print(mat[a][upright.y]+"\t");
}
for(int a = downright.y-1;a >= downleft.y ; a--){
lists.add(mat[downright.x][a]);
System.out.print(mat[downright.x][a]+"\t");
}
for(int a = downleft.x-1;a >= upleft.x+1 ; a--){
lists.add(mat[a][downleft.y]);
System.out.print(mat[a][downleft.y]+"\t");
}
}else{
for(int a = upleft.x;a <= downleft.x ; a++){
lists.add(mat[a][upleft.y]);
System.out.print(mat[a][upleft.y]+"\t");
}
}
}
}
int result [] = new int[m*n];
for (int j = 0;j<lists.size();j++){
result[j] = lists.get(j);
//System.out.print(result[j]+"\t");
}
System.out.println(result);
return result;
}