1 条题解
-
0
#include <bits/stdc++.h> using namespace std; int dx[4] = {0, 1, 1, -1}; int dy[4] = {1, -1, 0, 1}; //0方向:右,1方向:左下,2方向:下,3方向:右上 int a[22][22]; int main() { int n; scanf("%d", &n); memset(a, 0, sizeof(a)); //a全部为0,然后四周填-1 for (int i = 0; i <= n + 1; i++) { a[0][i] = a[n + 1][i] = -1; a[i][0] = a[i][n + 1] = -1; } //到此准备好了a数组,下来开始填 a[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]; if (t == 0 || t == 2) //注:向下和向右只走一步就要换方向 t++; a[x][y] = k; //填数字 k++; //准备下一个数字 } 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
- 43
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 6
- 标签
- 递交数
- 547
- 已通过
- 178
- 上传者