C语言问题,由于初学者,很多不理解,拜托大神写点注释,感激不尽尤其指针循环用指针数组和循环完成
如:传入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 展开
数组: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]);
}