对于给定的一个输入变量n,要求绘出一个n*n的二维数组,要求从数字1开始,从左到右,从上到下,进行螺旋式的填充,每填充一个数字,变量值+1。
这类问题基本上要考虑四个方向,用0,1,2,3分别表示四个方向,方向每变化一个,都要加1,并且和4求余数%4,用一个变量计数,从1-n*n结束,每次加一,遇到遍历过的位置或者边界就改变方向,直到输出最后一个数为止。
#include <stdio.h> using namespace std; int main() { int n; printf("请输入矩阵的大小 n: "); scanf("%d", &n); // 方向:0-右,1-下,2-左,3-上 int directions[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; int a[10000]; // 存储螺旋数组的一维表示 int x = 0, y = 0; // 当前位置 int dir = 0; // 当前方向:初始向右 int num = 1; // 当前要填入的数字 // 初始化数组为0(用于标记边界) for (int i = 0; i < n * n; i++) { a[i] = 0; } // 填充螺旋数组 for (int i = 0; i < n * n; i++) { a[x * n + y] = num++; // 将数字存入一维数组 // 计算下一个位置 int next_x = x + directions[dir][0]; int next_y = y + directions[dir][1]; // 检查是否需要改变方向: // 下一个位置超出边界,或者已经填过数字 if (next_x < 0 || next_x >= n || next_y < 0 || next_y >= n || a[next_x * n + next_y] != 0) { // 改变方向:右→下→左→上→右... dir = (dir + 1) % 4; next_x = x + directions[dir][0]; next_y = y + directions[dir][1]; } // 移动到下一个位置 x = next_x; y = next_y; } // 输出结果(按矩阵形式输出) printf("螺旋矩阵:\n"); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { printf("%3d ", a[i * n + j]); } printf("\n"); } return 0; }