SGU109 Magic of David Copperfield II

来源:互联网 发布:多张表格数据汇总透视 编辑:程序博客网 时间:2024/04/30 22:10

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

0 0