C语言实现打印螺旋数组(顺时针)
问题的描述是:给出一个30*30的二维数组,用1~900这900个数字去填满这个二维数组,并且打印结果。要求是实现填充顺序是顺时针,例如现在有一个3*3规模的二维数组,用9个数字去填满它,则结果如下。
1 2 3
8 9 4
7 6 5
可以看出这是一个顺时针打印的1~9的排列。
假定num = 1;
对于本题目给出的要求,我们想到用4个for循环分别打印行和列,并且每次打印num的值会依次递增,直到循环到最后一次后,num = 900为止,但是显然4个for循环不够打印出30*30的列表,所以这时候我们需要在4个for循环外面套上一个大的while循环,其存在是为了判断num目前的值是否小于等于900,如果条件为真,则执行循环,打印列表的行列,如果为假,则说明打印完成,那么就退出循环。
对于四个for循环,最难的就是如何控制行列的增加,比如说我第一个for循环,正常打印第一行1~30的数字,但是在这一轮所有的for循环打印完后,我该如何通过第一个for循环打印第二行呢?
所以就想到使用四个参数来表示行列的变化,我选择a,b,c,d来表示,下面是我的思路。


最开始我也是设了4个参数,但是由于混乱的逻辑,导致最后输出十分混乱,在经过画图和思考之后也理解了这四个参数之间的关系了,然后列出四个for()循环来解决问题。
接下来是代码部分,代码中我没有单独写打印函数,就直接在主函数中将最后的二维数组打印出来。
代码:
#include<stdio.h>
int main() {
int count = 0;//计数器
int rui[30][30] = { {0} };//二维数组
int num = 1;
int yang = 30 * 30;
int a = 0;//控制行的a b
int b = 29;
int c = 0;//控制列的c d
int d = 29;
while (num <= yang) {
for (int i = a; i <= b; i++) {
rui[c][i] = num++;
}c++;
for (int i = c; i <= d; i++) {
rui[i][b] = num++;
}b--;
for (int i = b; i >= a; i--) {
rui[d][i] = num++;
}d--;
for (int i = d; i >= c; i--) {
rui[i][a] = num++;
}a++;
}
for (int n = 0; n < 30; n++) {
for (int m = 0; m < 30; m++) {
printf("%4d", rui[n][m]);
count++;
if (count % 30 == 0) {//隔30个数换一行打印
printf("n");
}
}
}
return 0;
}
接下来是代码的运行结果:

当然,如果题目要求是输出二维数组中某个具体位置的值,你也可以在代码中添加相应的printf()即可。
这就是实现螺旋打印的代码了。
THE END