알고리즘/구현 및 시뮬레이션

[S2382] - [모의 SW 역량테스트] 미생물 격리

tongnamuu 2018. 8. 26. 21:42

https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV597vbqAH0DFAVl&categoryId=AV597vbqAH0DFAVl&categoryType=CODE

각각의 미생물 군집이 이동할 때 경계선에 닿는 경우, 합쳐지는 경우를 각각 구현하면 됩니다.

현재 상태를 저장할 배열 하나와 이동하여 합쳐지는 경우를 판단하기 위한 배열 하나, 총 2차원 배열 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
108
109
110
111
#include <iostream>
using namespace std;
struct map {
    int num = 0;
    int dir = 0;
    int sum = 0;
};
int dx[] = { 0-1,1,0,};
int dy[] = { 00,0,-1,};
int n, m, k;
map a[101][101];
map b[101][101];
 
void move()
{
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (a[i][j].num > 0)
            {
                int x = i + dx[a[i][j].dir];
                int y = j + dy[a[i][j].dir];
                if (x == || x == n - || y == || y == n - 1)
                {
                    b[x][y].num = a[i][j].num / 2;
                    b[x][y].sum = a[i][j].num / 2;
 
                    if (b[x][y].sum < a[i][j].num / 2)
                        b[x][y].sum = a[i][j].num / 2;
                    if (a[i][j].dir == 1)
                        b[x][y].dir = 2;
                    else if (a[i][j].dir == 2)
                        b[x][y].dir = 1;
                    else if (a[i][j].dir == 3)
                        b[x][y].dir = 4;
                    else if (a[i][j].dir == 4)
                        b[x][y].dir = 3;
                }
                else
                {
                    if (b[x][y].sum > 0)
                    {
                        b[x][y].num += a[i][j].num;
                        if (b[x][y].sum < a[i][j].num)
                        {
                            b[x][y].sum = a[i][j].num;
                            b[x][y].dir = a[i][j].dir;
                        }
                    }
                    else
                    {
                        b[x][y].num = a[i][j].num;
                        b[x][y].sum = b[x][y].num;
                        b[x][y].dir = a[i][j].dir;
                    }
                }
            }
        }
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++)
        {
            a[i][j] = b[i][j];
            b[i][j].num = 0;
            b[i][j].dir = 0;
            b[i][j].sum = 0;
        }
    }
}
int main()
{
    int T;
    cin >> T;
    for (int test_case = 1; test_case <= T; test_case++)
    {
        cin >> n >> m >> k;
        
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                //a[i][j] = { 0,0 };
                //b[i][j] = { 0,0,0 };
                a[i][j].dir = 0;
                a[i][j].num = 0;
                b[i][j].num = 0;
                b[i][j].dir = 0;
                b[i][j].sum = 0;
            }
        }
        int ans = 0;
        for (int i = 0; i < k; i++)
        {
            int sero, garo, num, dir;
            cin >> sero >> garo >> num >> dir;
            a[sero][garo].num = num;
            a[sero][garo].dir = dir;
        }
        for (int time = 0; time < m; time++)
        {
            move();
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++)
            {
                if (a[i][j].num>0)
                {
                    ans += a[i][j].num;
                }
            }
        }
        cout << '#' << test_case << ' ' << ans << '\n';
    }
}
cs