SGU 109 Magic of David Copperfield II

SGU_109

    一开始没有看到Ki是有范围限制的,于是构造了一个最简单的情况,先挪1步,然后把除左上角3个以外全删掉,然后再挪3步,除左上角外两个也删掉。返回的结果是PE,也着实让我困扰了一阵子。

    虽然上面出错了,不过最基本的构造思想还是有了:①如果移动奇数步,那么只可能移到和当前格子的曼哈顿距离是奇数的位置,这样相当于把棋盘进行了黑白染色,奇数步只能走到异色的区域,偶数步只能走到同色的区域。②我们可以先让观众移动N步,然后用类似上面的办法,一点点把观众逼到左上角即可。

#include<stdio.h>
#include<string.h>
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;
}


原文地址:https://www.cnblogs.com/staginner/p/2300793.html