C语言问题,由于初学者,很多不理解,拜托大神写点注释,感激不尽尤其指针循环用指针数组和循环完成

已知一个5X5的矩阵,传入不大于25的数,螺旋打印如下图形(如:传入18打印:1234516171806150007140008131211109... 已知一个5X5的矩阵,传入不大于25的数,螺旋打印如下图形(

如:传入18

打印:

1 2 3 4 5

16 17 18 0 6

15 0 0 0 7

14 0 0 0 8

13 12 11 10 9
展开
 我来答
cdyzxy
推荐于2016-08-30 · TA获得超过2.1万个赞
知道大有可为答主
回答量:1.4万
采纳率:84%
帮助的人:3584万
展开全部

数组:a[5][5]

方向:右x+1,y不变,下x不变y+1,左x-1,y不变,上x不变y-1

边界:数组下标取值大于0小于5

#include<stdio.h>

#define N 5
void main()
{
    int i,j,a[N][N],d[4][2]={ {1,0},{0,1},{-1,0},{0,-1} },dd,x,y,z,n,xx,yy;
    dd=0; //首选方向0(向右)    
    x=y=0; //起始坐标a[0][0]
    for ( i=0;i<N;i++ ) for ( j=0;j<N;j++ ) a[i][j]=0;
    scanf("%d",&n); z=1; //从1开始,到n结束
    while ( 1 )
    { a[y][x]=z; z++;
        if ( z>n || z>N*N ) break; //当前元素赋值,如果下个z超过n结束
        xx=x; xx+=d[dd][0]; yy=y; yy+=d[dd][1]; //用当前方向计算下一个位置
        //判断超出数组范围情况,或遇到已经赋值过的元素,需要更换方向
        while ( xx<0 || xx>=N || yy<0 || yy>=N || a[yy][xx] )
        { dd++; if ( dd>=4 ) dd=0; //更换下一个方向
            xx=x; xx+=d[dd][0]; yy=y; yy+=d[dd][1]; //重新计算坐标
        }
        x=xx; y=yy;
    }
    for ( i=0;i<N;i++,printf("\n") ) for ( j=0;j<N;j++ ) printf("%2d ",a[i][j]);

}

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式