(PAT乙级)1050 螺旋矩阵(C语言实现)

总结:

1、两个会卡住的思路难点:①n,m的值怎么确定。②怎么打印螺旋矩阵。

对于①:我本来的想法是找出N的所有约数,然后再在约数里面找到差值最小对应的n,m。这样步骤繁杂,又要先找约数,然后又要判断最小值是哪两个数的差。其实约数里面是有对应的,比如:12的约数(1,2,3,4,6,12),其中1、12/3、4/2、6是成对出现的,所以只用对其中小于N的开根号的数进行是否是约数判断即可。且从靠近N的开根号的点开始判断,因为很明显的知道,越中间的一对约数组,差值越小,并不需要去做寻找最小值的操作。通过这样的方式可以找到n,m。

对于②:掌握螺旋矩阵的规律——顺时针写出矩阵四个角的坐标分别是:(0,0)→(0,n-1)→(m-1,n-1)→(m-1,0),找到坐标变化的规律,(利用二维数组)顺时针打印螺旋矩阵,行的元素赋值从头到尾都负责到底,而列的元素赋值从头一个都倒数第二个。

注意点:还有需要注意的是如何确定螺旋转多少圈的问题,画了4*3的矩阵和4*4的矩阵来帮助分析,他们都是转两圈虽然第二圈值转到中途。即其实每转一圈需要用掉两列,如果是偶数列即为n/2求圈数便可,但如果是奇数列n/2还会剩下一列同样要转圈,所以应该是n/2+n%2,这样在偶数的时候取余不起作用,在奇数的时候又可以多加1圈。

2、输出格式注意一下就好:注意换行注意空格。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值