2016/01/31 코드 그라운드 문제 : 다트 게임

https://www.codeground.org/practice/practiceProbView.do?probId=4
다트판은 원형이고 총 20개의 점수가 균등한 칸으로 나누어져 있다. 생각해야 할 점은 크게 두가지다.
1. 거리에 따라 점수가 1,2,3배 혹은 0점이나 50점으로 된 다는 것.
2. 좌표를 입력받은 뒤 원형 좌표계에서 (x,y)는 (r cosθ , r sinθ)에 대응한다는 점을 이용해서 θ가 포함되는 범위를 계산해 대응하는 점수표를 찾는다. 나는 cos함수를 이용해서 sin이 음수냐 양수이냐에 따라 구분해줬는데 tan함수를 이용하면 2π범위에서 겹치지 않으니까 발산하는 경우만 잘 고려해주면 될 것 같기도 하다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// 아래 기본 제공된 코드를 수정 또는 삭제하고 본인이 코드를 사용하셔도 됩니다.
#include <stdio.h>
#include <math.h>
int A, B, C, D, E;
int point[2][11];//룰의 행과 열에 대응하는 점수
//double rule[2][11]; 
double rule[11];//y가 양수, 음수, 0일때는 양수로쳐도 됨, point를 구하기 위한 룰
void setDartboard() {
    point[0][0= 6;
    point[0][1= 13;
    point[0][2= 4;
    point[0][3= 18;
    point[0][4= 1;
    point[0][5= 20;
    point[0][6= 5;
    point[0][7= 12;
    point[0][8= 9;
    point[0][9= 14;
    point[0][10= 11;
    point[1][0= 11;
    point[1][1= 8;
    point[1][2= 16;
    point[1][3= 7;
    point[1][4= 19;
    point[1][5= 3;
    point[1][6= 17;
    point[1][7= 2;
    point[1][8= 15;
    point[1][9= 10;
    point[1][10= 6;
    /*for (int i = 0; i < 10; i++)
        rule[0][i] = sin((1 + 2 * i) / 20 * PI);
    rule[0][10] = sin(PI);
    for (int i = 0; i < 11; i++)
        rule[1][i] = rule[0][10 - i];*/
    double pi = 3.14159265358979323846;
        
    for (int i = 0; i < 10; i++)
        rule[i] = cos(pi/20*(1+2*i));
    rule[10= cos(pi);
}
int getpoint(double cos_theta, double y) {
    int k = 0;
    while (k<11 && rule[k]>cos_theta) //경계는 안 나온다고 했음
        k++;
    if (y >= 0return point[0][k];
    else return point[1][10 - k];
}
int score(double x, double y) {
    int result = 0,point;
    double dist;
    dist = sqrt(pow(x,2)+pow(y,2));
    point = getpoint(x / dist, y);
    if (dist > E) {
        result = 0 * point;
    }
    else if (dist >= D) {
        result = 2 * point;
    }
    else if (dist > C) {
        result = 1 * point;
    }
    else if (dist >= B) {
        result = 3 * point;
    }
    else if (dist > A) {
        result = 1 * point;
    }
    else {
        result = 50;
    }
    return result;
}
int main(void) {
       /* 아래 freopen 함수는 input.txt를 read only 형식으로 열고, 표준입력(키보드) 대신 input.txt 로 부터 읽어오겠다는 의미의 코드입니다.
       만약 본인 PC 에서 테스트 할 때는, 입력값을 input.txt에 저장한 후 freopen 함수를 사용하면
          그 아래에서 scanf 함수를 사용하여 표준입력 대신 input.txt 파일로 부터 입력값을 읽어 올 수 있습니다.
          또한, 본인 PC에서 freopen 함수를 사용하지 않고 표준입력을 사용하여 테스트하셔도 무방합니다.
       단, Codeground 시스템에서 "제출하기" 할 때에는 반드시 freopen 함수를 지우거나 주석(//) 처리 하셔야만 합니다. */
    // freopen("input.txt", "r", stdin);
    setbuf(stdout, NULL);
    int TC;
    int test_case;
    int N,count,i;
    double x, y;
    setDartboard();
    scanf("%d"&TC);
    for (test_case = 1; test_case <= TC; test_case++) {
        // 이 부분에서 알고리즘 프로그램을 작성하십시오. 기본 제공된 코드를 수정 또는 삭제하고 본인이 코드를 사용하셔도 됩니다.
        count = 0;
        scanf("%d %d %d %d %d"&A, &B, &C, &D, &E);
        scanf("%d"&N);
        for (i = 1; i <= N; i++) {
            scanf("%lf %lf"&x, &y);
            count = count + score(x, y);
        }
        // 이 부분에서 정답을 출력하십시오.
        printf("Case #%d\n", test_case);
        printf("%d\n", count);
    }
    return 0;    // 정상종료 시 반드시 0을 리턴해야 합니다.
}
cs

댓글