SGU109 Magic of David Copperfield II

3425 단어 구조sgu
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 <[email protected]> * 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;
    }

    좋은 웹페이지 즐겨찾기