/************************************************************** 题目:输入一个矩阵,按照从外向内里以顺时针的顺序依次打印出每一个 数字。 **************************************************************/ #include<stdio.h> void printMatrixInCircle(int** numbers,int columns, int rows,int start); void printMatrix(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; } } void printMatrixInCircle(int** numbers,int columns, int rows,int start) { int endX = columns - 1 -start; int endY = rows - 1 - start; //从左到右打印一行 for(int i=start; i<=endX; ++i) { int number = numbers[start][i]; printf("%d\t",number); } //从上到下打印一行 if(start < endY) { for(int i=start+1; i<=endY; ++i) { int number = numbers[i][endX]; printf("%d\t",number); } } //从右到左 if(start < endY && start < endX) { for(int i=endX-1; i>=start; --i) { int number = numbers[endY][i]; printf("%d\t",number); } } //从下到上 if(start < endY-1 && start < endX) { for(int i=endY-1; i>=start+1; --i) { int number = numbers[i][start]; printf("%d\t",number); } } } void test(int rows, int columns) { if(rows<=0 || columns<=0) return; //这里注意二维数组指针怎么创建!! int** numbers = new int*[rows]; for(int i=0; i<rows; ++i) { numbers[i] = new int[columns]; for(int j=0; j<columns; ++j) { numbers[i][j] = i*columns + j +1; } } printMatrix(numbers,columns,rows); for(int i=0; i<rows; ++i) { delete[] numbers[i]; } } int main() { test(3,3); printf("\n"); test(1,3); printf("\n"); test(3,1); printf("\n"); test(1,1); return 0; }从外向里打印数字,让循环继续的条件是columns>startX * 2 并且rows>startY * 2;
条件至少有三行两列,因此终止行号必须比起始号至少大2,同时终止列号大于起始列号。
==参考剑指offer
原文:http://blog.csdn.net/walkerkalr/article/details/21075825