回旋数组问题


刚开始学C的时候, 菜到不行... 还记得那时候有个叫范二安叔的人问过我一个回旋数组的问题. 当时就是没写出来. 后来到了大一晚上在图书馆死磕了写完了才回去.


还记得那会儿我高中刚毕业, 范二安叔初中毕业就没读书了去工作了. 即使现在回想起来, 还是觉得他很牛. 之后就很久没有联系说话了.... 


最近有朋友在学C, 于是就把这个问题抛给他了. 也是一个Green hand的分界点. 过了这个问题, 说明对于指针还有堆上内存有一定认识.  


以下是以前(两年多快三年了)写的代码. 有用就凑合玩玩~



#include<stdio.h>
#include<stdlib.h>
int main ()
{
    int** num;//定义二级指针
    int count=1,row=0,rank=0,cycle=0;//定义变量 count自增赋值,定义变量row,rank做行列变量,定义变量cycle圈数
    int n,m=0;//定义变量n正方形尺寸的大小,定义变量m做for循环计数变量

    printf("please enter the number of row :");
    //尽量将数字控制在10以内,因为控制台窗口程序当行满时会自动换行,窗口大小有限不能自由拓展

    scanf("%d",&n);
    //-----------------申请开辟一个N*N的内存区域-----------------------------
    num=(int**)malloc(n*sizeof(int*));
    for(m=0;m<n;m++)
    {
    *(num+m)=(int*)malloc(n*sizeof(int));
    }
    //------------------------------------------------------------------------

    if(n%2==0)//当n是偶数时候,为正方形二维数组  "逆时针回旋"  赋值
    {
        for(cycle=0;cycle<(n/2);cycle++)
        {
            for(row=cycle;row<n-cycle;row++,count++)
            {
                num[row][rank]=count;
            }
            count--;//很关键
            row--;//很关键的一步!row++后自增如果减一则会导致数组越界程序无法运行!!

            for(rank=cycle;rank<n-cycle;rank++,count++)
            {
                num[row][rank]=count;
            }
            rank--;
            count--;

            for(;row>=cycle;row--,count++)
            {
                num[row][rank]=count;
            }
            row++;
            count--;

            for(;rank>=cycle+1;rank--,count++)
            {
                num[row][rank]=count;
            }
            rank++;
        }
    }
    else//当n是奇数数时候,为正方形二维数组  "逆时针回旋"  赋值
    {
        for(cycle=0;cycle<(n-1)/2;cycle++)
        {
            for(row=cycle;row<n-cycle;row++,count++)
            {
                num[row][rank]=count;
            }
            row--;
            count--;

            for(rank=cycle;rank<n-cycle;rank++,count++)
            {
                num[row][rank]=count;
            }
            count--;
            rank--;

            for(;row>=cycle;row--,count++)
            {
                num[row][rank]=count;
            }
            count--;
            row++;

            for(;rank>=cycle+1;rank--,count++)
            {
                num[row][rank]=count;
            }
            rank++;

        }

        num[(n-1)/2][(n-1)/2]=count;
    }

    for(row=0;row<n;row++)//打印这个n*n的正方形数阵
    {
        for(rank=0;rank<n;rank++)
        {
            printf("\t%d",num[row][rank]);

            if(rank==(n-1))
                printf("\n\n\n");
        }
    }

    for(m=0;m<n;m++)//释放申请的二级指针内存
    {
        free(num[m]);
    }
    free(num);
    num=NULL;

    return 0;
}


最近可能会对这个版本提出修改或优化更新~











  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值