Computer Science/Algorithm Problem

백준] 2564 - 경비원(KOI 2007 지역본선 초등부)

TwinParadox 2018. 7. 23. 23:51
728x90

시간 제한 : 1초

메모리 제한 : 128MB




입력

첫째 줄에 블록의 가로의 길이와 세로의 길이가 차례로 주어진다. 둘째 줄에 상점의 개수가 주어진다. 블록의 가로의 길이와 세로의 길이, 상점의 개수는 모두 100이하의 자연수이다. 이어 한 줄에 하나씩 상점의 위치가 주어진다. 상점의 위치는 두 개의 자연수로 표시된다. 첫째 수는 상점이 위치한 방향을 나타내는데, 1은 블록의 북쪽, 2는 블록의 남쪽, 3은 블록의 서쪽, 4는 블록의 동쪽에 상점이 있음을 의미한다. 둘째 수는 상점이 블록의 북쪽 또는 남쪽에 위치한 경우 블록의 왼쪽 경계로부터의 거리를 나타내고, 상점이 블록의 동쪽 또는 서쪽에 위치한 경우 블록의 위쪽 경계로부터의 거리를 나타낸다. 마지막 줄에는 동근이의 위치가 상점의 위치와 같은 방식으로 주어진다. 상점의 위치나 동근이의 위치는 블록의 꼭짓점이 될 수 없다.




출력

첫째 줄에 동근이의 위치와 각 상점 사이의 최단 거리의 합을 출력한다.




소스코드

#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
int main(void)
{
	int w, h, n, sum = 0, dir, dist, tmp1, tmp2;
	cin >> w >> h >> n;
	vector<pair<int, int> > arr(n);
	for (int i = 0; i < n; i++)
		cin >> arr[i].first >> arr[i].second;
	cin >> dir >> dist;

	if (dir == 1)
		tmp1 = dist;
	else if (dir == 2)
		tmp1 = w + h + (w - dist);
	else if (dir == 3)
		tmp1 = w + h + w + (h - dist);
	else
		tmp1 = w + dist;

	for (int i = 0; i < n; i++)
	{
		if(arr[i].first==1)
			tmp2 = arr[i].second;
		else if(arr[i].first==2)
			tmp2 = w + h + (w - arr[i].second);
		else if(arr[i].first==3)
			tmp2 = w + h + w + (h - arr[i].second);
		else
			tmp2 = w + arr[i].second;
		int path1 = abs(tmp1 - tmp2);
		int path2 = 2 * w + 2 * h - path1;
		sum += path1 < path2 ? path1 : path2;
	}

	cout << sum;
}




Tip

기준점에서 어떤 지점을 가는 방법이 두 가지라는 것을 감안해 풀면 된다. if문으로 다 도배를 해도 되고 그냥 적당한 공식으로 switch-case 분기를 해도 되는 문제. 



728x90