這題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;
}