螺旋方阵(Leetcode第59题)

问题描述:螺旋矩阵

#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;
}

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

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

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

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

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

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

关于++i和i++的区别,可参考以下博主:https://blog.csdn.net/Cs_ChenSh/article/details/79955638

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

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

                                

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值