蛇形数组的总结

蛇形数组的总结

昨天看了蛇形数组,今天准备好好的把他总结一下。

第一次遇到蛇形填数的题时我可以说是完全不懂怎么写,就连思路都没有。后来再遇到他时,我去网上百度了一下,才有了一点对蛇形数组的了解。现在我就来谢谢吧。

思路:我觉得蛇形数组的关键还是如何将数存进一个二维数组。然后再依次将其输出就行,但我们必须要先输入,这才是最关键与最难的地方。

首先输入的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 }

 

 

posted @ 2021-01-20 09:36  potentia1  阅读(180)  评论(0)    收藏  举报