蛇形数组相关
本人第一篇CSND博客......
写的不好请见谅
思路
假设输入的边长为number,初始输入数字为put = 1;
首先我们先考虑分界轴以上的部分
我们定义两个变量
line : 用来控制斜线的根数
done :用来控制在当前斜线中的填充次数
我们的line从1开始,代表着是第一根斜线,通过观察,第一部分中总共有 number根斜线
所以第一部分的外层循环便是 line <= n
再观察每一根斜线所需要填充的数字次数,不难发现,次数等于line值
所以内层循环便是 done < line ,因为done初始化为零 ,所以这里没有等于号
接着是判断具体的数组坐标
当耿叔为奇数的时候,即line 为奇数 ,数字填充方向为左向右下填充
我们不考虑done的变化,奇数条的初始坐标为[0] [line-1]
考虑到外层[]是递增的,内层[]是逐步减小的
所以最终数组的坐标为[done] [line-1-done]
当根数为偶数的时候,即line为偶数,数字填充方向为右向左上填充
我们不考虑done的变化,偶数条的初始坐标为[line-1] [0]
考虑到外层[]是递减的,内层[]是逐步增大的
所以最终数组的坐标为[line-1-done] [done]
所以第一部分的代码是
for(int line = 1 ; line <= number ; line++){ for(int done = 0 ; done < line ; done++){ if(line % 2) arr[line - done -1][done] = put++; else arr[done][line-done-1] = put++; } }
接下来考虑第二部分
此时line应该为number+1 ,因为第一部分line已经为number了
整个填充过程中斜线的根数为2*number -1
所以外层循环为 line < 2*number
在第二部分中,假设斜线的根数重新开始计算,那么当line等于number-1时应该为第一根,我们设这个值为real
所以real = line - number
在观察每一根斜线所需要填充的数字次数,不难发现,次数等于number - real值
所以内层循环为(done = 0)
done < number - (line - number) done < 2*number-line
与第一部分一样
奇数初始位置为[real] [number - 1] 偶数的初始位置为 [number -1] [real]
同理
奇数的坐标为[real+done] [number -1 - done]
偶数的坐标为[number -1 - done] [real+done]
for(int line = number+1 ; line < 2* number ; line++){ for(int done = 0 ; done < 2*number - line ; done++){ if(line % 2) arr[number-done-1][line+done-number] = put++; else arr[line+done-number][number-done-1] = put++; }
所以总体的代码便是
#include<stdio.h> int main() { int number,put = 1; scanf("%d",&number); int arr[number][number]; for(int line = 1 ; line <= number ; line++){ for(int done = 0 ; done < line ; done++){ if(line % 2) arr[line - done -1][done] = put++; else arr[done][line-done-1] = put++; } } for(int line = number+1 ; line < 2* number ; line++){ for(int done = 0 ; done < 2*number - line ; done++){ if(line % 2) arr[number-done-1][line+done-number] = put++; else arr[line+done-number][number-done-1] = put++; } } for(int temp = 0 ; temp < number ; temp++){ for(int temp2 = 0 ; temp2 < number ; temp2++) printf("%-4d",arr[temp][temp2]); printf("\n"); } return 0; }