您的位置:首页 > Web前端

(《剑指Offer》笔记)顺时针打印矩阵

2014-09-15 16:24 134 查看
联系螺旋矩阵那一道题。解题思路都是先画图,然后发现螺旋相当于一圈一圈的打印,每一圈的起点都是(i,i)。

public class PrintMatrixInCircle {
//每一圈的起点都是(i,i)
//对于一个m*n的矩阵,最后一圈的起点坐标为min((m-1)/2,(n-1)/2),这是最后一个start的位置。因此m-1>=2*start,n-1>=2*start
//所以当row>startX*2&&column>startY*2时循环

public static void printMatrixClockWisely(int[][]numbers){
if(numbers==null)
return;
int rows=numbers.length;
int columns=numbers[0].length;
int start=0;
while(rows>start*2&&columns>start*2){
PrintMatrixInCircle(numbers,start);
start++;
}
}
/**m*n矩阵,第i圈四个顶点分别是(i.i) (i,n-i-1) (m-i-1,i) (m-i-1,n-i-1)坐标系横轴为row,纵轴为column
* @param numbers 数组
* @param start 每一圈开始的位置
*/
private static void PrintMatrixInCircle(int[][] numbers, int start) {
int rows=numbers.length;
int columns=numbers[0].length;
int endR=rows-start-1;
int endC=columns-start-1;
//从左到右打印一行
for(int i=start;i<=endC;i++){
System.out.println(numbers[start][i]);
}
//从上到下打印一列,说明至少两行
if(start<endR){
for(int i=start+1;i<=endR;i++){
System.out.println(numbers[i][endC]);
}
}
//从右到左打印一行,说明至少两行两列
if(start<endR&&start<endC){
for(int i=endC-1;i>=start;i--){
System.out.println(numbers[endR][i]);
}
}
//从下到上打印一列,说明至少三行两列
if(start<endR-1&&start<endC){
for(int i=endR-1;i>=start+1;i--){
System.out.println(numbers[i][start]);
}
}
}
public static void main(String[] args) {
int[][]numbers=new int[][]{{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
printMatrixClockWisely(numbers);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: