알고리즘/구현 및 시뮬레이션
[S2382] - [모의 SW 역량테스트] 미생물 격리
tongnamuu
2018. 8. 26. 21:42
각각의 미생물 군집이 이동할 때 경계선에 닿는 경우, 합쳐지는 경우를 각각 구현하면 됩니다.
현재 상태를 저장할 배열 하나와 이동하여 합쳐지는 경우를 판단하기 위한 배열 하나, 총 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,0 }; int dy[] = { 0, 0,0,-1,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 == 0 || x == n - 1 || y == 0 || 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 |