SGU109 Magic of David Copperfield II
题目大意
从一个N * N矩阵的左上角出发,每次走K步后删除不可能处于的位置,最后保留一个位置
要求构造每次走的步数以及删除的方案
算法思路
根据曼哈顿距离的奇偶性,只需走两次即可
- 第一次走奇数步,可将与1的曼哈顿距离为偶数的位置排除
- 第二次再走奇数步,可将与1的曼哈顿距离为奇数的位置排除
- 最后保留1即可
时间复杂度: O(N2)
代码
/**
* Copyright (c) 2015 Authors. All rights reserved.
*
* FileName: 109.cpp
* Author: Beiyu Li <sysulby@gmail.com>
* Date: 2015-05-22
*/
#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for (int i = 0; i < (n); ++i)
#define For(i,s,t) for (int i = (s); i <= (t); ++i)
#define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i)
typedef long long LL;
typedef pair<int, int> Pii;
const int inf = 0x3f3f3f3f;
const LL infLL = 0x3f3f3f3f3f3f3f3fLL;
int main()
{
int n;
scanf("%d", &n);
printf("%d", n * 2 + 1);
For(i,1,n) For(j,1,n) if (~(i + j) & 1) {
int v = (i - 1) * n + j;
if (v != 1) printf(" %d", v);
}
puts("");
printf("%d", n * 2 + 3);
For(i,1,n) For(j,1,n) if ((i + j) & 1) {
int v = (i - 1) * n + j;
if (v != 1) printf(" %d", v);
}
puts("");
return 0;
}