史上最弱代码
#include <iostream>
#include <math.h>
#include <vector>
using namespace std;
const int N = 100;
int x, y;
int res[10][10];
int main() {
cin >> x >> y;
// 总是行大于等于列
// 所以行等于总数字数能组成的矩形的外接正方姓的边数
int m = ceil(sqrt(y - x + 1));
// 列无非等于行或者行-1
int n;
if (y - x + 1 > m * (m - 1))
n = m;
else
n = m - 1;
// 起始位置
int i = (m + 1) / 2 - 1;
int j = (n + 1) / 2 - 1;
res[i][j] = x ++;
// k 进循环次数
// step 每次进循环走几步
int step = 1, k = 0;
vector<pair<int, int>> dxdy = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
// 每次进循环换一下方向,走step步
// 每进两次循环也就是换两次方向step++
while (x <= y) {
int dx, dy;
dx = dxdy[k % 4].first;
dy = dxdy[k % 4].second;
for (int t = 1; x <= y && t <= step; t ++) {
i += dx, j += dy;
res[i][j] = x ++;
}
k ++;
if (k % 2 == 0) {
step ++;
}
}
// 这么奇怪的输出是因为有个测试不知道为什么卡了,只有一位数时不能 %2d 输出
for (i = 0; i < m; i ++) {
for (j = 0; j < n; j ++) {
if (res[i][j] == 0)
printf(" ");
else
if (y < 10)
printf("%d ", res[i][j]);
else
printf("%2d ", res[i][j]);
}
puts("");
}
return 0;
}