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

교수가 한 바퀴 돌고 온 구간이 위의 그림과 같다고 하자. 당신은 이 구간이 convex가 아니라는 것을 깨달았다. 따라서 아래와 같이 "pocket" 을 채워서 convex로 만들려고 한다.
아래의 둘 중 하나를 만족하면 "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을 사용함으로써 더 빨리 케이크를 먹을 수 있게 될 수 있을 것이다!
아래의 그림을 살펴보자. 
회색 칸은 벽을 나타내고 흰색 칸은 아무것도 없는 빈 공간을 나타낸다. 또한 빨간색 점은 당신의 위치이다.
오른쪽을 향해 파란색 포탈 건을 발사하면 위의 그림과 같이 파란색 포탈이 생긴다.
아래쪽을 향해 노란색 포탈 건을 발사한 후의 상태이다.
남쪽으로 한번 이동하였다.
한번 더 남쪽으로 이동하였다. 아래쪽의 노란색 포탈을 통해 파란색 포탈로 순간이동하게 되었다.
똑같은 색깔의 포탈은 최대 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 위치에는 배치할 수 없다.
한 교실의 배치도가 주어져 있을 때, 이 교실에서 최대 몇 명의 학생이 시험을 볼 수 있는지 구하시오. 물론 모든 학생이 치팅할 수 없는 위치에 있어야 한다.
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
허접 포탈 풀이를 해보았습니다.
1.미로를 찾는다.
2.포탈로 거리를 줄인다.
우선 미로찾는 알고리즘을 간단히 생각해 보았다.
이름하여 프로브 알고리즘.
전제:프로브는 자기가 지나온 길의 중요포인트(시작,끝,코너) 및 전체 코너의 수와 전체이동거리를 기억한다. 자기자신을 무한히 복사할 수 있다.(기억한거 포함) - (클래스로 구현하면 될듯)
맵을 읽어들인 배열이 있다.
미로찾기 알고리즘: 프로브알고리즘 by Carlo
스텝1:시작점에 프로브를 만든다.
스텝2:모든프로브는 새로운길이 2개이상일 경우 자기자신을 하나이상 복사하여 (어떠한방향으로)한칸 전진한다.
스텝3:모든프로브의 생과사를 점검한다.
1:충돌상황 점검: 생존의 우선순위 -- 적은전체거리>적은코너>컴퓨터저장상위랭크
2:생존 프로브수: 0 이면 실패
3:끝점에 도착한프로브? 있으면 성공
스텝4:Go to 스텝2
포탈사용 알고리즘: 포탈가속화알고리즘 by Carlo
전제:생존프로브는 중요 포인트, 전체 거리, 전체 코너수를 기억하고 있다.
: Sum=0, N=0
스텝1:메모리에 기억하고있는 N,N+1번째 포인트 사의의 거리와 N,N+1번째 포인의 이동방향의 각각의 벽방향과의 거리의 합((N쪽벽과 N사이의거리)+ (N+1쪽벽과 N+1사이의 거리))과 비교하여 작은쪽으로 Sum에 더한다.
스텝2:if N+1== 전체코너+ 2 끝
스텝3:N++ Go to step1
머그다지 효율성과 결과는 확인해보지 못했습니다. ;;
http://univac.egloos.com/
그럼, 남은 명절즐겁게 ...
C번 풀이에서,
--
두번째 줄에 1000100 이라는 상태의 최대값을 구한다고 가정해 봅시다. 1에다가 학생을 배치한다고 보면 됩니다. 이 경우에는 첫번째 줄의 1,2,4,5,6 칸에 학생이 배치되어 있으면 Cheating을 할 수 있게 되지요. 즉 1,2,4,5,6이 항상 비어있는 모든 경우의 최대값 + 2 라는 값이 되는 것이지요. (두번째 줄에 2명 배치했으니까요 :)
--
라고 되어있는데, 1,2,4,5,6이 아니라 2,4,6이 아닌가요~??
C번 문제는 bipartite graph에서 maximum independent set을 찾는 문제로 치환할 수 있겠군요.
그래서 matching으로 되는듯?! 합니다.
http://acm.pku.edu.cn/JudgeOnline/problem?id=3692
이 문제도 풀어보세요~



많이 늦었지만. GCJ R3 풀이가 업데이트되었습니다. 관심 좀... (굽신굽신)