蛇形数组的总结
蛇形数组的总结
昨天看了蛇形数组,今天准备好好的把他总结一下。
第一次遇到蛇形填数的题时我可以说是完全不懂怎么写,就连思路都没有。后来再遇到他时,我去网上百度了一下,才有了一点对蛇形数组的了解。现在我就来谢谢吧。
思路:我觉得蛇形数组的关键还是如何将数存进一个二维数组。然后再依次将其输出就行,但我们必须要先输入,这才是最关键与最难的地方。
首先输入的n阶方正中的n可以理解为边长。我们应该知道,那个最外层的循环会执行n/2次,所以开始我们将n/=2,每执行一次最外面的循环就将它-1,这样就可以知道我们要执行多少次循环。注意:当n为奇数时,我们必须要对最中间的数专门进行一次赋值,写为if(n%2!=0) a[(n-1)/2][(n-1)/2] = ++k;因为当n为奇数时,我们是不能将最中间的给赋值到的。
还有,我觉得我觉得也是比较诡异的地方,就是每次你执行一次内部循环,你都只能赋值l-1个数(这里l是我们每轮的边长)。这样赋值四次就能将一圈全部赋值。
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int n,l,k = 0,i = 0,j;//i代表行,j代表列 6 int s[105][105] = {0};//开一个二维数组 7 cin>>n;//输入n,n也代表外部边长 8 j = l = n-1; 9 for(int i2 = n/2 ;i2 > 0 ;i2--) 10 { 11 for(int i1 = 0 ;i1<l ;i1++) 12 s[i++][j] = ++k; 13 for(int i1 = 0 ;i1<l ;i1++) 14 s[i][j--] = ++k; 15 for(int i1 = 0 ;i1<l ;i1++) 16 s[i--][j] = ++k; 17 for(int i1 = 0 ;i1<l ;i1++) 18 s[i][j++] = ++k; 19 l-=2;//每轮减二,因为边长每执行一次就会减二 20 j--; 21 i++; 22 } 23 if(n%2) s[(n-1)/2][(n-1)/2] = ++k;//这一步很重要没有的话n为奇数的时候就不能赋值完。 24 for(int i = 0;i<n;i++) //这一步遍历来输出 25 { 26 for(int j = 0;j<n;j++) 27 { 28 cout<<s[i][j]<<" "; 29 } 30 cout<<endl; 31 } 32 return 0; 33 }

浙公网安备 33010602011771号