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;
}

接下来是代码的运行结果:

AI配图魔改

当然,如果题目要求是输出二维数组中某个具体位置的值,你也可以在代码中添加相应的printf()即可。

这就是实现螺旋打印的代码了。

THE END