题目大意:这是一个魔术游戏,首先把你的手指放在一个左上角的格子里面,然后魔术师说你可以移动K1步,移动完之后,他会删除一些方格,并且说,你肯定不在这里,删除的方格不可以再去了,然后让你再走K2步,继续删除一些格子,直到就剩下一个格子为止,魔术师就可以说抓住你了,输出每个Ki和删除的格子。
分析:比较明显的利用了奇偶性质,所以每次走奇数步的话就可以了,删除的格子可以从左下角开始,把相同奇偶性质的都给删除即可,注意数N<=K<300,当N等于100的时候,K只能从100开始.............
代码如下:
===========================================================================================================================
#include<stdio.h> #include<algorithm> #include<vector> using namespace std; const int MAXN = 107; int main() { int i, j, N; vector<int> G[MAXN*2]; scanf("%d", &N); for(i=1; i<=N; i++) for(j=1; j<=N; j++) { if(i+j-2 > N) G[N+3].push_back((i-1)*N+j); else G[i+j].push_back((i-1)*N+j); } int cnt = N; for(i=N+3; i>2; i--) { printf("%d", cnt);cnt = (cnt&1 ? cnt+2:cnt+1); for(j=0; j<G[i].size(); j++) printf(" %d", G[i][j]); printf("\n"); } return 0; }