사용자 도구

사이트 도구


ps:problems:boj:11164

Traveling Cellsperson

ps
링크acmicpc.net/…
출처BOJ
문제 번호11163
문제명Traveling Cellsperson
레벨실버 3
분류

애드혹

시간복잡도O(1)
사용한 언어Python 3.13
제출기록32412KB / 32ms
최고기록32ms
해결날짜2025/04/04

풀이

  • 그리드에서 S의 위치는 답에 영향을 주지 않는다. 그리드의 크기만 중요하다.
  • 그리드 그래프는 R또는 C가 짝수이면 해밀턴 사이클을 갖는다. 해밀턴 사이클을 따라서 이동한다면, 모든 노드를 방문하고 돌아오는 이동 거리는 노드 개수만큼이 된다. 즉 답은 R*C
  • R과 C가 3이상인 홀수일 경우에는, 그래프에서 노드 하나를 제거해서 해밀턴 그래프로 만들수가 있다. 이 위에서 해밀턴 사이클을 따라 이동하고, 제거한 노드 옆을 지나갈때만 그 노드를 방문하고 돌아오면 된다. 이동거리는 R*C-1 + 2 = R*C+1 이 된다
  • R=1일 때에는, 시작 노드에서 한쪽 끝까지 갔다가 다른쪽 끝까지 갔다가 다시 시작 노드로 돌아와야 한다. 이동거리는 (C-1)*2.
    • C=1 일때도 마찬가지로 구한다.

코드

"""Solution code for "BOJ 11164. Traveling Cellsperson".

- Problem link: https://www.acmicpc.net/problem/11164
- Solution link: http://www.teferi.net/ps/problems/boj/11164

Tags: [ad hoc]
"""

import sys


def main():
    T = int(sys.stdin.readline())
    for _ in range(T):
        X, Y = [int(x) for x in sys.stdin.readline().split()]
        # pylint: disable-next=unused-variable
        grid = [sys.stdin.readline().rstrip() for _ in range(Y)]

        if X == Y == 1:
            print('0')
        elif X == 1 or Y == 1:
            print((max(X, Y) - 1) * 2)
        elif X % 2 == Y % 2 == 1:
            print(X * Y + 1)
        else:
            print(X * Y)

    print('LOL')


if __name__ == '__main__':
    main()

토론

댓글을 입력하세요:
 
ps/problems/boj/11164.txt · 마지막으로 수정됨: 2025/04/04 09:15 저자 teferi