PTA C语言实现螺旋方阵

一.整体思路:

        对于问题进行思考:
首先,确定问题的实现过程:一圈一圈的实现对一个二维数组的赋值,最后再将二维数组格式化输出即可。
其次,将其与程序实现过程联系起来。设二维数组大小为n*n,从二维数组的(0,0)开始,到(0,n-1),到(n-1,n-1),到(n-1,0),再到(1,0)。完成一轮螺旋(即一圈)。当n足够大,第二轮螺旋开始:从二维数组的(1,1)开始,到(1,n-2),到(n-2,n-2),到(n-2,1),再到(2,1)。完成第二轮循环。第三轮循环开始:从二维数组的(2,2)开始,到(2,n-3),到(n-3,n-3),到(n-3,2),再到(3,2)。完成第三轮循环。。。

最后,思考结束时的情况,当n为偶数时,按照上面的逻辑程序能够解决问题;当n为奇数时,按理说也能够实现,但是考虑到程序设计的简便,和对循环(几轮螺旋)的控制,我们只在循环结束之后,在对中间位置进行赋值。

二.程序的实现代码

        

#include<stdio.h>

int main(){

    int nums[10][10]={0};
    int n=0;
    scanf("%d",&n);

    int x=0,y=0,count=0;
    int num=1;
    while(1){
        //向右赋值,达到边界后停止,由于对二维数组赋值之后y会自增,所以退出本层循环时,还要将y--
        printf("第1个子循环:\n");
        do{//你也可以不用y--,然后自己观察一下情况。(程序容易二次赋值,这应当作为重点检查)
            nums[x][y]=num; printf("%d %d num:%d\n",x,y,num); num++; y++;
        }while(y<n-count); y--;
        //向下赋值,注意:这里是先实现x++避免和上面重复,由于先实现x++,所以判断的条件会变
        printf("第2个子循环:\n");
        do{
            x++; nums[x][y]=num; printf("%d %d num:%d\n",x,y,num); num++;
        }while(x<n-count-1);
        //开始向左赋值,基本原理同上
        printf("第3个子循环:\n");
        do{
            y--; nums[x][y]=num; printf("%d %d num:%d\n",x,y,num); num++;
        }while(y>count);
        //即将完成一轮螺旋,使用count计数
        count++;
        //避免重复赋值,所以要count++。
        printf("第4个子循环:\n");
        while(x>count){
            x--; nums[x][y]=num; printf("%d %d num:%d count:%d\n",x,y,num,count); num++;
        }
        //准备开始第二轮循环
        y+=1;
        //判断是否满足退出循环的条件
        if(count>=n/2){ break;}//奇数还需要中间那个数
    }
    printf("循环之外:%d %d\n",x,y);//查看循环之外的x和y
    if(n%2==1) nums[x][y]=num;//当n为奇数时,对其中间位置进行赋值
    for(int i=0;i<n;i++){
        for(int ii=0;ii<n;ii++){
            printf("%3d",nums[i][ii]);
        }
        printf("\n");
    }
}

/*
 * 本程序的原理是将每一层螺旋作为一个循环,完成一轮螺旋之后再开始下一轮螺旋。
 * 程序的核心在于while的循环写法。
 */

三.总结

        程序的实现仅仅针对此问题,代码的逻辑也仅仅局限于这一问题。如果您有更好的解决思路以及程序,欢迎您在评论区进行指点。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值