1 条题解
-
-1
#include <bits/stdc++.h> using namespace std; int dx[4] = {1, 0, -1, 0}; //可以用花括号初始化数组 int dy[4] = {0, 1, 0, -1}; //dx和dy数组用于控制方向,0方向:下,1方向:右,2方向:上,3方向:左 int a[22][22]; //把所有的数填到二维数组,最后输出二维数组a int main() { int n;scanf("%d", &n); //第一步: 初始化 二维数组a,中间区域为0,四周边框为-1 memset(a, 0, sizeof(a)); //memset为初始化所有格子为0,0表示可以格子还没填数 for (int i = 0; i <= n + 1; i++) { a[0][i] = a[n + 1][i] = -1; //先把第0行和第n+1行填-1 a[i][0] = a[i][n + 1] = -1; //先把第0列和第n+1列填-1 } //第二步:填写 a数组的中间区域 a[1][1] = 1; //一开始第一行第一列的格子填1 int x = 1, y = 1, k = 2, t = 0; //x和y表示当前位置,k表示即将准备要填的数字,t表示现在前进的方向(方向0~3) while (k <= n * n) { while (a[x + dx[t]][y + dy[t]] != 0) //预先评估按原来的方向走的下个格子是否为0,不为0就换方向 { t++; //碰到不为0的格子,就换个方向 if (t == 4) t = 0; //如果方向为4,那么就变成0,以达到方向循环的效果 } //到这里,说明此时的 a[x + dx[t]][y + dy[t]] 等于0,否则无法退出上面的while; x = x + dx[t]; y = y + dy[t]; a[x][y] = k; //填数字 k++; //准备下一个数字 } //第三步:打印a数组的中间区域 for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) printf("%4d", a[i][j]); printf("\n"); } return 0; }
- 1
信息
- ID
- 42
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 7
- 标签
- 递交数
- 851
- 已通过
- 202
- 上传者