题目描述:输入一个数组(m*n维),要求从外向里顺时针打印数组的元素。
#include <iostream> #include <stdio.h> using namespace std; void PrintMatrixInCircle(int **numbers,int rows,int columns,int start); void printNumber(int number);
void PrintMatrixCircle(int **numbers,int rows,int columns) { //验证输入是否符合要求 if(numbers==NULL||rows<=0||columns<=0) return; //每一圈从左上角元素开始,numbers[start][start] int start=0; //循环条件的理解 while(rows>2*start&&(columns>2*start)) { PrintMatrixInCircle(numbers,rows,columns,start); ++start; } }
void PrintMatrixInCircle(int **numbers,int rows,int columns,int start) { //从左像右打印矩阵 for(int i=start;i<=columns-1-start;++i) { int number=numbers[start][i]; printNumber(number); } //从上向下打印矩阵 //前提条件:终止行号>起始行号 if(start<rows-1-start) { for(int i=start+1;i<=rows-1-start;++i) { int number=numbers[i][columns-1-start]; printNumber(number); } } //从右向左打印矩阵 //前提条件:终止行号>起始行号,并且,终止列号>起始列号 if((start<columns-start-1)&&(start<rows-1-start)) { for(int i=columns-2-start;i>=start;--i) { int number=numbers[rows-1-start][i]; printNumber(number); } } //从下向上打印矩阵 //前提条件:至少为三行两列。终止行号-起始行号=2,并且,终止列号>起始列号 if((start<rows-1-start-1)&&(start<columns-1-start)) { for(int i=rows-1-start-1;i>=start+1;--i) { int number=numbers[i][start]; printNumber(number); } } } void printNumber(int number) { printf("%d\t ",number); }
void Test(int rows,int columns) { printf("Test Begin:%d columns,%d rows.\n",columns,rows); //不符合条件的输入 if(rows<1||columns<1) return; int i; //将二维数组的每一行看做一个指针数组, //并指定分为rows行。 int **numbers=new int*[rows]; for(i=0;i<rows;++i) { //为二维数组的每行分配columns个数。 numbers[i]=new int[columns]; for(int j=0;j<columns;++j) { numbers[i][j]=i*columns+j+1;//定义二维数组的值 } } PrintMatrixCircle(numbers,rows,columns); printf("\n"); for(int i=0;i<rows;++i) delete[] (int*)numbers[i]; delete[] numbers; }
int main() { Test(4,4); Test(4,5); return 0; }
时间: 2024-11-09 00:02:14