PTA-螺旋方阵

 

 

老实说,最开始看到他我是拒绝的。转来转去晕了。后来看了网上的思路,给了我一些启示。于是我自己写了一个。

具体思路呢?

我是先按具体例子走的,比如说N=5的情况,就是由特殊推导一般。这里用count作计数器,它只需要加1就行了。用x,y作坐标,表示出每个点。先走第一排,就是x=0,y递增的情况。走到最后停止。但由于for的特性,y多加了1,所以下面就减掉。接下来要装最右侧一列,当然y不变。此时x还是0,所以x又加1。后面也是一样的思路。直到我把外圈全部填充,我发现接下来填充的方向又回到了水平。就是说,我的填充又要顺时针来一遍。我不禁有了些想法,我当然可以一直对应着写,但一旦N换了,那种穷尽的思想就不顶用了。这是不是暗示我该用循环了呢?

要使用循环,难点仍在于找到拐点。但此时,之前的x<=N-1 已经不再适用,还那么用,我会把已填充部分覆盖的。于是就想到,我先让整个数组全是0,一旦他被填充就不再是0。这样就有了限制第二条件,a[x][y] == 0,只有他是零,我才填充,不是零,那我就是到了边界,我要拐弯了。

感觉应该对,但又不可贸然进行全部改动。这让我想起了做小车的比赛,我该一点一点的写代码,边写边检验。只有这样,才不至于出现不知道哪错的情况。我一个个加条件。同时在纸上过一遍。

最后,很幸运,也很骄傲,我写对了。

 

下面附上源码:

 

#include<stdio.h>
int main()
{
    int N,x=0,y=0,count=1;
    int a[10][10] = {0};
    scanf("%d",&N);
    if(N==1)
    {
        a[0][0] = 1;
    }
    else
    {
        while(count<=N*N)
        {
            for( ;y<=N-1&&a[x][y] == 0;y++)
            {
                a[x][y] = count;
                count++;
            }
            y--;
            x++;
        
            for( ;x<=N-1 && a[x][y] == 0 ;x++)
            {
                a[x][y] = count;
                count++;
            }   
            x--;
            y--;
        
            for( ;y>=0 && a[x][y] == 0;y--)
            {
                a[x][y] = count;
                count++;
            }
            y++;
            x--;
            for( ;a[x][y]==0 ;x--)
            {
                a[x][y] = count;
                count++;
            }
            x++;
            y++;
        }
        
    }
    
    for(x=0;x<=N-1;x++)
    {
        for(y=0;y<=N-1;y++)
        {
            printf("%3d",a[x][y]);
        }
        printf("\n");
    }
    return 0;
 }

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值