这题UVA上做过类似题,不过这一题又多了一个条件,就是步数只能在n到300之间
那怎么办呢。
其实多一个构造就可以了,一开始走n步,把右下角整块移除掉,那剩下n条对角线,那最多就只用到299步就可以啦
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n;
int main() {
while (~scanf("%d", &n)) {
if (n != 2) {
printf("%d", n);
for (int i = 1; i < n; i++) {
for (int j = n - 1; j > n - i; j--) {
printf(" %d", i * n + j + 1);
}
}
}
printf("\n");
int s = n + 1 + n % 2;
for (int i = n; i > 0; i--) {
printf("%d", s);
for (int j = max(0, i - n + 1); j < min(n, i + 1); j++) {
int k = i - j;
printf(" %d", j * n + k + 1);
}
s += 2;
printf("\n");
}
}
return 0;
}