Game Develop

[Algorithm] Baekjoon 20057번 : 마법사 상어와 토네이도 본문

Algorithm/Baekjoon

[Algorithm] Baekjoon 20057번 : 마법사 상어와 토네이도

MaxLevel 2023. 9. 6. 13:01

https://www.acmicpc.net/problem/20057

 

20057번: 마법사 상어와 토네이도

마법사 상어가 토네이도를 배웠고, 오늘은 토네이도를 크기가 N×N인 격자로 나누어진 모래밭에서 연습하려고 한다. 위치 (r, c)는 격자의 r행 c열을 의미하고, A[r][c]는 (r, c)에 있는 모래의 양을

www.acmicpc.net

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
int tornadoDir[4][2= { {0,-1}, {1,0}, {0,1}, {-1,0} }; // 2칸마다 이동거리+1씩
int sendDir[4][10][3=
{
    {
        {0,-2,5}, {-1,-1,10}, {1,-1,10}, {-1,0,7}, {1,0,7}, {-2,0,2}, {2,0,2},{-1,1,1}, {1,1,1}, {0,-1,100}
    } ,
    {
        {2,0,5}, {1,-1,10}, {1,1,10}, {0,-1,7}, {0,1,7},{0,-2,2}, {0,2,2}, {-1,-1,1}, {-1,1,1}, {1,0,100}
    },
    {
        {0,2,5}, {-1,1,10}, {1,1,10}, {-1,0,7}, {1,0,7},{-2,0,2}, {2,0,2},{-1,-1,1}, {1,-1,1}, {0,1,100}
    },
    {
        {-2,0,5}, {-1,-1,10}, {-1,1,10}, {0,-1,7}, {0,1,7}, {0,-2,2}, {0,2,2}, {1,-1,1}, {1,1,1}, {-1,0,100}
    }
};
 
int n;
int arr[501][501= { 0 };
 
int main(void)
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
 
    cin >> n;
 
    int curY = n / 2// 토네이도 위치.
    int curX = n / 2;
 
    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < n; ++j)
        {
            cin >> arr[i][j];
        }
    }
 
    int answer = 0;
    int dirIndex = 0;
    int moveCount = 0;
    
    while (1)
    {
        if (dirIndex % 2 == 0++moveCount;
 
        for (int i = 0; i < moveCount; ++i)
        {
            int nextY = curY + tornadoDir[dirIndex][0];
            int nextX = curX + tornadoDir[dirIndex][1];
            float send = arr[nextY][nextX];
 
            for (int j = 0; j < 10++j)
            {
                int sendNextY = nextY + sendDir[dirIndex][j][0];
                int sendNextX = nextX + sendDir[dirIndex][j][1];
                float ratio = sendDir[dirIndex][j][2];
 
                if (sendNextY < 0 || sendNextY >= n || sendNextX < 0 || sendNextX >= n)
                {
                    if (j == 9)
                    {
                        answer += arr[nextY][nextX];
                        arr[nextY][nextX] = 0;
                    }
                    else
                    {
                        answer += floor(send * (ratio / 100));
                        arr[nextY][nextX] -= floor(send * (ratio / 100));
                    }
                }
                else
                {
                    if (j == 9)
                    {
                        arr[sendNextY][sendNextX] += arr[nextY][nextX];
                        arr[nextY][nextX] = 0;
                    }
                    else
                    {
                        arr[sendNextY][sendNextX] += floor(send * (ratio / 100));
                        arr[nextY][nextX] -= floor(send * (ratio / 100));
                    }
                }
            }
 
            curY = nextY;
            curX = nextX;
            if (curY == 0 && curX == 0break;
        }
 
        if (curY == 0 && curX == 0break;
 
        ++dirIndex;
        if (dirIndex == 4) dirIndex = 0;
    }
 
    cout << answer;
}
cs

다른 시리즈와 마찬가지로 구현은 어렵지 않고, 룩업테이블 작성하는 것만 조금 귀찮았다(sendDir).