(剑指Offer)面试题20:顺时针打印矩阵

题目:

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,

例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

思路:

把矩阵想象成若干个圈,通过循环操作来打印矩阵,每次打印矩阵中的一个圈;

1、循环起始条件和结束条件:

起始条件:(1,1),(2,2)。。。(start,start)

结束条件:columns>start*2 && rows>start*2

2、如何打印一圈:

分为四步:1、从左到右打印一行(上);2、从上到下打印一列(右);3、从右到左打印一行(下);4、从下到上打印一列(左)

每一步根据起始坐标和终止坐标用一个循环就可以打印一行或一列,但并不是每一圈都需要打印四次,有些圈可能退化为一行或一列或其他,需要考虑每一步打印的前题条件;

3、每一步打印的前提条件:

第一步:没有,一定需要的;

第二步:终止行号大于起始行号;

第三步:终止行号大于起始行号&&终止列号大于起始列号;

第四部:终止行号大于起始行号+1,&&终止列号大于起始列号;

代码:

#include <stdio.h>
#include <stdlib.h>

using namespace std;


void PrintMatrixInCircle(int** numbers,int columns,int rows,int start){
    int endX=columns-1-start;
    int endY=rows-1-start;

    // print from left to right
    for(int i=start;i<=endX;i++)
        printf("%d ",numbers[start][i]);

    // print from top to bottom
    if(endY>start){
        for(int i=start+1;i<=endY;i++)
            printf("%d ",numbers[i][endX]);
    }

    // print from right to left
    if(endY>start && endX>start){
        for(int i=endX-1;i>=start;i--)
            printf("%d ",numbers[endY][i]);
    }

    // print bottom to top
    if(endX>start && endY>(start+1)){
        for(int i=endY-1;i>=start+1;i--)
            printf("%d ",numbers[i][start]);
    }
}

void PrintMatrixClockwisely(int** numbers,int columns,int rows){
    if(numbers==NULL || columns<=0 || rows<=0)
        return;
    int start=0;
    while(columns>start*2 && rows>start*2){
        PrintMatrixInCircle(numbers,columns,rows,start);
        ++start;
    }
    printf("
");
}

int main()
{
    const int M=4;
    const int N=4;
    /*
    int** array=new int*[M];
    for(int i=0;i<M;i++)
        array[i]=new int[N];
    */
    int** array=(int **)malloc(M *sizeof(int *));
    for(int i=0;i<M;i++)
        array[i] = (int *)malloc(N *sizeof(int));

    int k=1;
    for(int i=0;i<M;i++){
        for(int j=0;j<N;j++)
            array[i][j]=k++;
    }

    PrintMatrixClockwisely(array,M,N);

    for(int i=0;i<M;i++){
        free(array[i]);
        array[i] = NULL;
    }
    free(array);
    array=NULL;

    return 0;
}

在线测试OJ:

http://www.nowcoder.com/books/coding-interviews/9b4c81a02cd34f76be2659fa0d54342a?rp=1

AC代码:

class Solution {
public:
    void PrintMatrixInCircle(const vector<vector<int> > &matrix,vector<int> &mat,int rows,int columns,int start){
        int endX=columns-1-start;
    	int endY=rows-1-start;

    	// print from left to right
    	for(int i=start;i<=endX;i++)
        	mat.push_back(matrix[start][i]);
        	//printf("%d ",numbers[start][i]);

    	// print from top to bottom
    	if(endY>start){
        	for(int i=start+1;i<=endY;i++)
            	mat.push_back(matrix[i][endX]);
            	//printf("%d ",numbers[i][endX]);
    	}

    	if(endY>start && endX>start){
        	for(int i=endX-1;i>=start;i--)
            	mat.push_back(matrix[endY][i]);
            	//printf("%d ",numbers[endY][i]);
    	}

    	if(endX>start && endY>(start+1)){
        	for(int i=endY-1;i>=start+1;i--)
            	mat.push_back(matrix[i][start]);
            	//printf("%d ",numbers[i][start]);
   		}
 	}
    vector<int> printMatrix(vector<vector<int> > matrix) {
		int rows=matrix.size();
        int columns=matrix[0].size();
        int start=0;
        vector<int> mat;
        while(columns>2*start && rows>2*start){
            PrintMatrixInCircle(matrix,mat,rows,columns,start);
            ++start;
        }
        return mat;
    }
};
原文地址:https://www.cnblogs.com/AndyJee/p/4649476.html