问题描述:螺旋矩阵

#include <stdio.h>
#include <memory.h>
int main(){
int n;
scanf("%d",&n);
int i, c = 0, r = 0,num = 0,cnt = n/2;
int a[n][n];
while (cnt--){
for (i = r; i<n-c; i++) //→
a[r][i] = num++;
r++;
for (i = r; i<n-c; i++) //↓
a[i][n-c-1] = num++;
c++;
for (i = c-1; i<n-c; i++) //←
a[n-r][n-i-2] = num++;
// for (i = n - c; i >= r - 1; i--) //←
// a[n-r][i] = ++num;//减减方法
// for (i = n - c - 1; i > r-1; i--) //↑
// a[i][c-1] = num++;
for (i = r; i<n-r; i++) //↑
a[n-1-i][c-1] = num++;
}
if(n%2 != 0) //如果是奇数,填上正中间那个数
a[n/2][n/2] = num++;
for (int i =0; i<n; i++){ //遍历输出
for (int j =0; j<n; j++)
printf("%3d",a[i][j]);
printf("\n");
}
return 0;
}

螺旋方阵(Leetcode第59题)_赋值

思路:最开始我做题的想法不是这样的,我最开始用的是二维数组去赋值(两个for循环),因为输出螺旋矩阵,是个二维的,所以最开始想的就是用两个for循环,以至于思维受限,导致很久都没有相出解决方法来。就只让最外面的一层给按顺序给排序好了,其他的就不对了。应该的思维是一次一次的排序,而不是两个for循环的排序。具体方法请看代码即可理解清楚。首先,因为要进行的螺旋排序不止一圈,所以要在一个while循环中进行,循环判断的条件是方阵阶数的二分之一,如果是奇数,那最中心的那个数是需要单独赋值的,及最大值,如果是偶数直接排序即可。

思考如下几个问题:①在进行向左和向上时只能用++的方式?,可以怎么改?

                                 ②为什么我输出的结果是0开始的?如果改?改的方式?

解决:①不止可以以++的方式,还可以--的方式,在惯性思维里用的是--的方式,但是这里用--的方式的话,它的判断条件就不一样了,这里需要仔细考虑。

         当减减时就是从最右边开始往左减减,一直减到第一个,也就是第0列的位置,判断停止,向上也是同样的判断,但是最后到达的地方的判断的条件不一致,这里需要思考一下(因为第0行已经有数了,所以不能取等号),减减的方式也附上了。

      ②输出是0开始是因为最开始的初始值为0,有两个方法可以解决此问题,第一个也是最简单的,就是把初始值赋值为1开始,第二个方法是num++变成++num,这个一般很少想得到,这里又涉及到了另一个知识点,可以复习一下。

强调:本题的关键还有一点是循环的判断条件,也就是没次for循环的终止点在哪,下一次的开始点是那,这要搞清楚,不然会重复和乱,坚持一种原则即可

例如:左闭右开,如下图(这点很关键,再次强调)

螺旋方阵(Leetcode第59题)_i++_02