打印一个环绕型的数组,🤔,那么元素应该先从左到右(看具体情况),到末列时候在从上往下,到末行在从右往左 and so on;
首先,定义一个动态二维数组, int **arr=new int *[rows]; for(int i=0;i<rows;i++){ arr[i]=new int [line];rows ,line 都为手动输入的;以便可以实现各种长度的;然后就可以开始去给数组中每个元素赋值了
int startA=0,startB=0,endA=rows-1,endB=line-1; int i=0,count=0(计数)首先从左到右for(i=startB;i<endB;i++){arr[startA][i]=++count;}
从上到下 for(i=startA;i<=endA;i++){arr[i][endB]=++count;}. 从右到左 for(i=endB-1;i>=startB;i--){arr[endA][i]=++count;}从下到上 for(i=endA-1;i>=startA;i--){arr[i][startB]=++count;}
形成一个矩形后每次循环时初始值会减一,并且末尾值也会减一;即endA--;endB--;startA++;startB++;
当然条件应该是while(count<row*line);
最后,动态数组空间要回收;
for(int i=0;i<rows;i++)
{
delete [] arr[i];
}
delete [] arr;
完整代码:#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int rows;
cout << "Input a rows :";
cin>>rows;
int line;
cout << "Input a line :";
cin>>line;
int **arr=new int* [rows];
for(int i=0;i<rows;i++)
{
arr[i]=new int [line];
}
int i=0;
int startA=0;
int startB=0;
int endA=rows-1;
int endB=line-1;
int count=0;
while(count <rows*line)
{
for(i=startB;i<=endB;i++)
{
arr[startA][i]=++count;
}
for(i=startA+1;i<=endA;i++)
{ arr[i][endB]=++count;
}
for(i=endB-1;i>=startB;i--)
{
arr[endA][i]=++count;
}
for(i=endA-1;i>=startA+1;i--)
{arr[i][startB]=++count;
}
startA++;
startB++;
endA--;
endB--;
}
for(int i=0;i<rows;i++)
{
for(int j=0;j<line;j++)
{
cout <<setw(4)<< arr[i][j]<<" ";
}
cout <<endl;
}
for(int i=0;i<rows;i++)
{
delete [] arr[i];
}
delete [] arr;
return 0;
}