先说说我做这个题的思路,其实一开始拿到这个题的时候,我半天没有想法。就是不知道从哪开始,后来我就在想,既然是顺时针打印输出,我就先模拟输出一圈的情况,然后一圈的情况能够正常输出了(一圈的输出有四种情况:上边界从左到右,右边界从上到下,下边界从右到左,左边界从下到上);那么怎么样才能继续内部的输出呢,那么我想如果可以在一个循环里,那就可以一圈一圈的输出了。那么问题又来了,循环的次数如何获得呢,我于是在纸上鼓捣了半天,发现这个循环次数是有规律的,于是我获得了循环的次数。那么在循环内部,如果我将第一次外圈的输出的边界条件找到,那么整个对数组的顺时针遍历不久完成了嘛。按照我的思路,我试着将原来外圈的固定的边界值更改,终于成功解决了这个问题。那么对于这道题的经验就是在你没有思路的时候,尝试着先一小步的尝试,你的每一次尝试都是对你思想的发散,然后当你的一小步尝试取得成功,你就可以在这个基础上往下一步走,这样就将一个问题分块解决掉了。
#include<iostream>
using namespace std;
void print(int** &pArray,int row,int col)
{
int i;
int deque=(row>col?(col+1)/2:(row+1)/2);//循环次数
//每次循环的起始坐标为(0,0)(1,1)(2,2)...
//四个方向的一圈输出完成之后,则进入下一个循环,进行内部的输出
for(int xunhuan=0;xunhuan<deque;++xunhuan)
{//BEGIN
//上边界从左到右
for (i=xunhuan;i<col-xunhuan;++i)
{
cout<<pArray[xunhuan][i];
}
//右边界从上到下
for (i=xunhuan+1;i<row-xunhuan;++i)
{
cout<<pArray[i][col-1-xunhuan];
}
//下边界从右到左
for (i=col-2-xunhuan;i>=xunhuan;--i)
{
cout<<pArray[row-xunhuan-1][i];
}
//左边界从下到上
for (i=row-2-xunhuan;i>=xunhuan+1;--i)
{
cout<<pArray[i][xunhuan];
}
}//END
}
int main()
{
int **pArray;
int row,col;
cout<<"请分别输入行数和列数:"<<endl;
cin>>row>>col;//输入行数和列数
//创建行指针?
pArray=new int*[row];
//为每一行分配空间
for (int p=0;p<row;++p)
{
pArray[p]=new int[col];
}
cout<<"请为数组赋值:"<<endl;
//为数组赋值
for (int m=0;m<row;++m)
{
for (int n=0;n<col;++n)
{
cin>>pArray[m][n];
}
}
print(pArray,row,col);
return 0;
}