题目描述:输入一个数组(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;
}