아무도 안올리셔서 제가 씁니다 :)



  A. How Big Are the Pockets?

   [문제 설명]

  Polygonovich 교수는 평면 상의 위치에서 랜덤하게 걸어다니는것을 즐긴다. 교수는 아침에 원점에서 북쪽을 바라보며 긴 여행을 떠난다. 교수는 직진하거나 왼쪽으로 90도 회전, 오른쪽으로 90도 회전만 하면서 여행을 즐긴다. 이 여행동안 한번 방문했던 점을 두번 다시 방문하지 않으며, 해가 지기 전에 시작했던 위치로 돌아온다. 따라서 교수가 지나간 경로는 연결하면 하나의 도형을 만들게 된다. (아래 그림 참조)

  a1.jpg
  
 교수가 한 바퀴 돌고 온 구간이 위의 그림과 같다고 하자. 당신은 이 구간이 convex가 아니라는 것을 깨달았다. 따라서 아래와 같이 "pocket" 을 채워서 convex로 만들려고 한다.
a2.jpg

 아래의 둘 중 하나를 만족하면 "pocket" 이라고 부른다.

 1) 한 점을 기준으로 위-아래가 막혀있으면 이 점은 pocket이다. 
 2) 한 점을 기준으로 왼쪽-오른쪽이 막혀있으면 이 점은 pocket이다.

 따라서 첫 번째 그림에서 x는 2)를, y는 1), 2)를, z)는 1)을 만족하므로 이 세 점은 pocket이고, w는 둘 다 만족하지 않으므로 pocket이 아니다.

 교수가 이동한 경로가 입력으로 주어질 때, "pocket"의 크기를 출력하는 프로그램을 작성하시오.

  Small Data Set) 각 좌표의 절대값은 100 이하
  Large Data Set) 각 좌표의 절대값은 3000 이하

  




  B. Portal

   [문제 설명]
 
  Portal은 1인칭 퍼즐 게임으로, 이 게임의 주인공은 벽에 두 개의 포탈을 만들어서, 한쪽 포탈에 들어가면 반대쪽 포탈로 나올 수 있다. 이 문제는 비슷한 아이디어에서 출발한다.

  (R, C) 크기의 격자판이 있다. 당신은 이 격자판 어딘가에 위치해 있고, 또 다른 위치에는 맛있는 케이크가 놓여져 있다. 당신은 매우 배가 고프기 때문에 최대한 빨리 이 케이크를 먹고 싶어한다. 당신은 현재 위치에서 동서남북 네 방향으로 이동할 수 있으며, 당신에게는 Portal Gun이 있어 포탈을 만들어서 이동할 수도 있다.

  당신을 Portal Gun을 이용하여 두 가지 포탈 (노란색, 파란색)을 만들 수 있으며, 무조건 직진하는 성질을 가지고 있다. 또한 케이크가 있더라도 그대로 투과하는 성질을 가지고 있다. 다만 Portal Gun은 동서남북 네 방향으로만 발사할 수 있다.

  노란색과 파란색 포탈을 만들었다면, 당신은 이 포탈을 통해 이동할 수 있다. 노란색 포탈로 들어갔다면 파란색 포탈로 나오게 되며, 그 반대의 경우도 성립한다. 당신은 Portal Gun을 사용함으로써 더 빨리 케이크를 먹을 수 있게 될 수 있을 것이다! 

   아래의 그림을 살펴보자. 
b1.jpg
  회색 칸은 벽을 나타내고 흰색 칸은 아무것도 없는 빈 공간을 나타낸다. 또한 빨간색 점은 당신의 위치이다.
b2.jpg
  오른쪽을 향해 파란색 포탈 건을 발사하면 위의 그림과 같이 파란색 포탈이 생긴다.
b3.jpg
  아래쪽을 향해 노란색 포탈 건을 발사한 후의 상태이다.
b4.jpg
   남쪽으로 한번 이동하였다.
b5.jpg
  한번 더 남쪽으로 이동하였다. 아래쪽의 노란색 포탈을 통해 파란색 포탈로 순간이동하게 되었다.
b6.jpg
  똑같은 색깔의 포탈은 최대 1개만 존재한다. 현재 위치에서 파란색 포탈을 왼쪽으로 쏘면 위의 그림과 같이 된다.

  포탈은 무조건 벽에만 만들 수 있으며, 포탈이 없는 벽으로는 이동할 수 없다. 포탈 건을 사용하는 것은 이동횟수로 세지 않는다고 가정한다. 케이크를 먹을 수 있는 최소 이동횟수를 구하시오.

  Small Data Set) 최대 Grid 크기는 8 x 8
  Large Data Set) 최대 Grid 크기는 15 x 15



  C. No Cheating

   [문제 설명]
 
  기말고사를 앞두고 있는 알고스팟 고등학교에서는 몇 명의 학생이 수시로 치팅을 시도한다는 정보를 입수했다. 그래서 이 학교의 교장인 JM은 이러한 부정행위를 방지하는 자리배치를 하려고 한다. 이 클래스룸은 M개의 행 N개의 열로 구성되어 있으며 각각의 칸에 책상들이 배치되어 있다. 다만 일부 책상은 파손되어 배치할 수 없게 되어 있다.

  각 학생은 자기 자리로부터 왼쪽, 오른쪽, 왼쪽 앞, 오른쪽 앞 자리의 시험지를 볼 수 있다. 따라서 어떤 자리에 학생을 위치시켰다면 A,C,D,E 위치에는 배치할 수 없다.

c1.jpg

  한 교실의 배치도가 주어져 있을 때, 이 교실에서 최대 몇 명의 학생이 시험을 볼 수 있는지 구하시오. 물론 모든 학생이 치팅할 수 없는 위치에 있어야 한다.  

  Small Data Set) 최대 교실 크기는 10 x 10
  Large Data Set) 최대 교실 크기는 80 x 80



  D. Endless Knight

   [문제 설명]
 
  체스의 Knight는 L자 모양으로 점프할 수 있는 말이다. (r1, c1)에서 (r2, c2)로 점프할 수 있다는 뜻은 (r1 - r2)^2 + (c1 - c2)^2 = 5를 만족하는 것과 같은 의미를 가진다.

  이 문제에서는 왼쪽 위 좌표(1, 1)에서 출발하여 (H, W)까지 이동하는 것이 목표이다. 또한 이 문제에서 적용되는 두 가지 제약조건이 있는데, 첫 번째 조건은 Knight는 반드시 x,y 좌표가 증가하는 방향으로만 이동하여야 한다. 즉 (1, 2)로 이동하거나 (2, 1)로 이동하여야 한다. [ (1, -2)나 (2, -1)은 잘못된 이동이다. ] 두 번째 조건은 Knight가 절대로 갈 수 없는 바위가 R개(R <= 10) 있다는 점이다.

  당신은 (1, 1)에서 (H, W)까지 가는 경로의 수를 구하고 싶어한다. 다만 이 수는 매우 크기 때문에 10007로 나눈 나머지를 구하려고 한다. 참고로 10007은 소수(Prime Number)이다.

  Small Data Set) H, W <= 100
  Large Data Set) H, W <= 100,000,000