一.整体思路:
对于问题进行思考:
首先,确定问题的实现过程:一圈一圈的实现对一个二维数组的赋值,最后再将二维数组格式化输出即可。
其次,将其与程序实现过程联系起来。设二维数组大小为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的循环写法。
*/
三.总结
程序的实现仅仅针对此问题,代码的逻辑也仅仅局限于这一问题。如果您有更好的解决思路以及程序,欢迎您在评论区进行指点。