题目描述
输入整数N,输出一个N阶的回字形二维数组。
数组的最外层为1,次外层为2,以此类推。
这个题不会做,看的题解,找了一个比较容易理解的解法
谈谈自己对这道的算法的理解。
这道题核心思想是直接向二维数组中填入数据,通过定义一个m变量,我认为m+1为圈数,同时也是向二维数组填入的数据。两层循环中(最外层循环不考虑),外层循环控制圈数,内层循环填入数据,同时注意,内层循环临时变量k的起始和结束会随着圈数的改变而变化。
内层循环通过交换横纵坐标的方式填充数据。这样做会导致重复填充,这也是这个算法的不足之处,期待以后可以优化。
#include<iostream>
using namespace std;
const int N = 100;
int main()
{
int nums[N];
int resnums[N][N];
int num,index=0;
while(true){
cin>>num;
if(num==0)break;
nums[index++]=num;
}
for(int i=0;i<index;i++){
int m=nums[i]/2;
int temp=nums[i];
if(nums[i]%2)m++;
for(int j=0;j<=m;j++){
for(int k=j;k<temp;k++){
resnums[j][k]=j+1;
resnums[k][j]=j+1;
resnums[nums[i]-1-j][k]=j+1;
resnums[k][nums[i]-1-j]=j+1;
}
temp--;
}
for(int j=0;j<nums[i];j++){
for(int k=0;k<nums[i];k++){
cout<<resnums[j][k]<<' ';
}
cout<<'\n';
}
cout<<'\n';
}
return 0;
}