剑指offer-第四章解决面试题的思路(顺序打印矩阵)

题目:输入一个矩阵,按照从外向里的顺序依次打印出每一个数。(画图让抽象的问题形象化)

思路:打印矩阵时,把每一层当做一个圈来打印,找到打印整个矩阵的截止条件。

从上图中我可以看到一个6*6的矩阵(长宽分别为cloums,rows)最后一圈的最左边的顶点上面的坐标为(2,2),我们同时发现在一个5*5的矩阵中最后一圈的最左边的顶点的坐标也为(2,2),并且这个顶点的坐标的横坐标和纵坐标是相同的暂且设置为(start,start),因此我们可以得到截止条件即为,cloums>startX*2,rows>startY*2.并且我们同时发现打印没一圈的时候都是同样的操作,因此,我们可以使用递归来完成该操作。

打印每一圈的情况如下图所示:

C++代码:

#include<iostream>
using namespace std;
void printMatrixInCircle(int** numbers,int cloums,int rows,int start)
{
    int endx=cloums-1-start;
    int endy=rows-1-start;
    //从左到右打印
    for(int i=start;i<=endx;i++)
    {
        int number=numbers[start][i];
        cout<<number<<" ";
    }
       
    //从上到下打印
    if(start<endy)
    {
        for(int i=start+1;i<=endy;i++)
        {
            int number=numbers[i][endx];
            cout<<number<<" ";
        }
    }
    //从右到左打印
    if(start<endx&&start<endy)
    {
        for(int i=endx-1;i>=start;i--)
        {
            int number=numbers[endx][i];
            cout<<number<<" ";
        }
    }
    //从下到上打印
    if(start<endx&&start<endy-1)
    {
        for(int i=endy-1;i>=start+1;i--)
        {
            int number=numbers[i][start];
            cout<<number<<" ";
        }
    }
}
void printMatrixClockWisely(int** numbers,int cloums,int rows)
{
    if(numbers==NULL||cloums<=0||rows<=0)
        return;
    int start=0;
    while(cloums>start*2&&rows>start*2)
    {
        printMatrixInCircle(numbers,cloums,rows,start);
        start++;
        cout<<endl;
    }

}

void main()
{ 
    int a[][3]={{1,2,3},{4,5,6},{7,8,9}};
    int** b=new int*[3];
    for(int i=0;i<3;i++)
    {
        b[i]=a[i];
    }
    printMatrixClockWisely(b,3,3);
}

Java代码:

public class PrintMatrix {

    public static void printMatrixInCircle(int[][] numbers,int cloums,int rows,int start)
    {
        int endx=cloums-1-start;
        int endy=rows-1-start;
        //从左到右打印
        for(int i=start;i<=endx;i++)
        {
            int number=numbers[start][i];
            System.out.print(number+" ");
        }
           
        //从上到下打印
        if(start<endy)
        {
            for(int i=start+1;i<=endy;i++)
            {
                int number=numbers[i][endx];
                System.out.print(number+" ");
            }
        }
        //从右到左打印
        if(start<endx&&start<endy)
        {
            for(int i=endx-1;i>=start;i--)
            {
                int number=numbers[endx][i];
                System.out.print(number+" ");
            }
        }
        //从下到上打印
        if(start<endx&&start<endy-1)
        {
            for(int i=endy-1;i>=start+1;i--)
            {
                int number=numbers[i][start];
                System.out.print(number+" ");
            }
        }
    }
    public static void printMatrixClockWisely(int[][] numbers,int cloums,int rows)
    {
        if(numbers==null||cloums<=0||rows<=0)
            return;
        int start=0;
        while(cloums>start*2&&rows>start*2)
        {
            printMatrixInCircle(numbers,cloums,rows,start);
            start++;
            System.out.println();
        }

    }

    public static void main(String[] args)
    { 
        int a[][]={{1,2,3},{4,5,6},{7,8,9}};
        
        
        printMatrixClockWisely(a,3,3);
    }

}

 

posted @ 2015-06-22 18:34  lisahappy  阅读(402)  评论(0编辑  收藏  举报