ACM준비/SCPC

다트 게임

조규현15 2015. 10. 15. 00:09
반응형

구현 문제이다.

다트에 해당하는 점수를 얻는 함수를 구현해야 하는게 일이다.

get 함수에 더러운 if, else if는 그 부분이며 앞 부분은

다트의 Position ( x, y )으로 부터 arctan함수를 사용하여

ceta값을 구하고 다트 판의 점수를 얻는 부분이다.

#define PI 3.141592
#define _d 18
using namespace std;

int get(int x, int y)
{
	double ceta = atan2(y, x );
	if(ceta<0)
		ceta = 2*PI + ceta;
	double angle = ceta * 180 / PI;

	double first = _d / 2;

	if (first + _d > angle && angle > first)
		return 13;
	else if (first + _d*2 > angle && angle > first + _d)
		return 4;
	else if (first + _d * 3 > angle && angle > first + _d*2)
		return 18;
	else if (first + _d * 4 > angle && angle > first + _d*3)
		return 1;
	else if (first + _d * 5 > angle && angle > first + _d*4)
		return 20;
	else if (first + _d * 6 > angle && angle > first + _d*5)
		return 5;
	else if (first + _d * 7 > angle && angle > first + _d*6)
		return 12;
	else if (first + _d * 8 > angle && angle > first + _d*7)
		return 9;
	else if (first + _d * 9 > angle && angle > first + _d*8)
		return 14;
	else if (first + _d * 10 > angle && angle > first + _d*9)
		return 11;
	else if (first + _d * 11 > angle && angle > first + _d*10)
		return 8;
	else if (first + _d * 12 > angle && angle > first + _d*11)
		return 16;
	else if (first + _d * 13 > angle && angle > first + _d * 12)
		return 7;
	else if (first + _d * 14 > angle && angle > first + _d * 13)
		return 19;
	else if (first + _d * 15 > angle && angle > first + _d * 14)
		return 3;
	else if (first + _d * 16 > angle && angle > first + _d * 15)
		return 17;
	else if (first + _d * 17 > angle && angle > first + _d * 16)
		return 2;
	else if (first + _d * 18 > angle && angle > first + _d * 17)
		return 15;
	else if (first + _d * 19 > angle && angle > first + _d * 18)
		return 10;
	else if (360 >= angle && angle > first + _d * 19)
		return 6;
	else if (first > angle && angle >= 0)
		return 6;
}
int main(int argc, char** argv) {
	int T;
	int test_case;
	/* 아래 freopen 함수는 input.txt 를 read only 형식으로 연 후,
	앞으로 표준 입력(키보드) 대신 input.txt 파일로 부터 읽어오겠다는 의미의 코드입니다.
	만약 본인의 PC 에서 테스트 할 때는, 입력값을 input.txt에 저장한 후 freopen 함수를 사용하면,
	그 아래에서 cin 을 사용하여 표준 입력 대신 input.txt 파일로 부터 입력값을 읽어 올 수 있습니다.
	따라서 본인의 PC 에서 테스트 할 때에는 아래 주석을 지우고 이 함수를 사용하셔도 됩니다.
	단, 이 시스템에서 "제출하기" 할 때에는 반드시 freopen 함수를 지우거나 주석 처리 하셔야 합니다. */
	//freopen("input.txt", "r", stdin);

	scanf("%d", &T);	//Codeground 시스템에서는 C++ 에서도 scanf 사용을 권장합니다.
	for (test_case = 1; test_case <= T; ++test_case) {
		//	이 부분에서 알고리즘 프로그램을 작성하십시오.
		int A, B, C, D, E;
		scanf("%d %d %d %d %d", &A, &B, &C, &D, &E);
		int N;
		int V = 0;
		scanf("%d", &N);
		for (int i = 0; i < N; i++)
		{
			int x, y;
			scanf("%d %d", &x, &y);

			float R = sqrt(x*x+y*y);

			if (R < A)
				V += 50;
			else if (B < R && R < C)// x3
				V += get(x, y) * 3;
			else if (D < R && R < E)// x2
				V += get(x, y) * 2;
			else if (R > E)
				V += 0;
			else
				V += get(x, y);
		}

		//	이 부분에서 정답을 출력하십시오. Codeground 시스템에서는 C++ 에서도 printf 사용을 권장합니다. 
		printf("Case #%d\n", test_case);
		printf("%d\n", V);
	}

	return 0;	//	정상종료 시 반드시 0을 리턴해야 합니다.
}
반응형

'ACM준비 > SCPC' 카테고리의 다른 글

좋은 수  (0) 2015.10.15
미궁 속의 방  (0) 2015.10.15
시험 공부  (0) 2015.10.14
프로그래밍 경진대회  (0) 2015.10.14
숫자 골라내기  (0) 2015.10.14