BOJ 1074 - Z




質問リンク

  • 関数→2^n*2^n配列で(r,c)アクセス順を返す関数

  • base condition → n == 0: return 0

  • 復帰式
  • (r,c)いくつかの象限で重要です!
    1象限であればreturn func(n-1,r,c)
    2象限の場合は、2^(n-1)*2^(n-1)+func(n-,r,c-2^(n-1))を返します.
    3象限の場合は2(2^(n-1)2^(n-1))+func(n-,r-2^(n-1),c)を返します.
    4象限であればreturn 3(2^(n-1)2^(n-1))+func(n-,r-2^(n-1),c-2^(n-1)
    import sys
    def zigzag(n, r, c):
        if n == 0:
            return 0
        half = 1 << (n-1)
    
        if r < half and c < half:
            return zigzag(n-1, r, c)
        if r < half and c >= half:
            return half*half + zigzag(n-1, r, c - half)
        if r >= half and c < half:
            return 2*half*half + zigzag(n-1, r - half, c)
        return 3*half*half + zigzag(n-1, r - half, c - half)
    
    n, r, c = map(int, sys.stdin.readline().split(' '))
    print(zigzag(n, r, c))