SGU_109
一开始没有看到Ki是有范围限制的,于是构造了一个最简单的情况,先挪1步,然后把除左上角3个以外全删掉,然后再挪3步,除左上角外两个也删掉。返回的结果是PE,也着实让我困扰了一阵子。
虽然上面出错了,不过最基本的构造思想还是有了:①如果移动奇数步,那么只可能移到和当前格子的曼哈顿距离是奇数的位置,这样相当于把棋盘进行了黑白染色,奇数步只能走到异色的区域,偶数步只能走到同色的区域。②我们可以先让观众移动N步,然后用类似上面的办法,一点点把观众逼到左上角即可。
#include#include int N; void solve() { int i, j, x, y, n; printf("%d", N); for(i = 2; i < N; i ++) for(j = N - i + 1; j < N; j ++) printf(" %d", i * N + j + 1); printf("\n"); n = (N % 2 ? N + 2 : N + 1); for(i = N; i >= 1; i --) { printf("%d", n); n += 2; for(x = 0, y = i; x < N && y >= 0; x ++, y --) { if(y >= N) continue; printf(" %d", x * N + y + 1); } printf("\n"); } } int main() { while(scanf("%d", &N) == 1) { if(N == 2) { printf("3 4\n"); printf("5 2 3\n"); } else solve(); } return 0; }