Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 백준 5397
- qorwns
- 시간 복잡도
- Stack 이란
- c#
- 백준 17822
- 백준 1406
- 해시 구현
- dfs
- 백준 2447
- 게리멘더링2
- 해시구현
- 별 찍기 10
- 백준 17779
- 백준 17471
- C/C++ 구현
- 자료구조
- 백준
- heap
- 원판 돌리기
- 1764
- 5397
- 버킷 정렬
- AVL 시간 복잡도
- ㅣ풀이
- 풀이
- 스택의 특징
- 구현
- 조세퍼스 순열
- 백준 1158
Archives
- Today
- Total
홍시홍의 프로그래밍
[swea 2382] 미생물 격리 본문
분류 : 구현
요구사항
조건대로 구현하기
풀이
쉽게 구현하는 방법을 찾아야하는데
하드하게 n*n 행렬을 모두 탐색하며 구현도 해봤고
다른 풀이를 참조하여 미생물의 수만큼만 움직이면서 구현도 해봤다
문제를 푸는 방법은 많은거 같다
초반에 풀때 좀더 손 쉽게 풀 수 있는 방법을 찾는다면 좋다
#include <iostream>
#include <vector>
#include <string.h>
using namespace std;
struct go {
int x;
int y;
int num;
int dir;
int alive;
};
int n, m, k;
go virus[1100];
int dr[5] = { 0,-1,1,0,0 };
int dc[5] = { 0,0,0,-1,1 };
//0 최대 값, 1 최대 인덱스, 2 최대 인덱스의 num
int visit[110][110][4];
int ans = 0;
int get_dir(int d) {
if (d == 1) return 2;
else if (d == 2) return 1;
else if (d == 3) return 4;
else if (d == 4) return 3;
}
// 이동하면 거기에 어떤 놈이 있는가 확인
// 있으면 어느 놈이 최대이였는가 확인
// alive 최대가 아닌 놈 들은 alive를 0으로 바꿔주면된다
//
void solve() {
int time = 0;
while (true) {
if (time == m)
break;
//이동
for (int i = 0; i < k; i++) {
if (virus[i].alive == 0) continue;
int x = virus[i].x + dr[virus[i].dir];
int y = virus[i].y + dc[virus[i].dir];
int num = virus[i].num;
virus[i].x = x;
virus[i].y = y;
if (x == 0 || y == 0 || x == n - 1 || y == n - 1) {
virus[i].num = num / 2;
virus[i].dir = get_dir(virus[i].dir);
visit[x][y][2] += (num / 2);
if (visit[x][y][0] < num) {
visit[x][y][0] = num;
visit[x][y][1] = i;
}
}
else {
visit[x][y][2] += num;
if (visit[x][y][0] < num) {
visit[x][y][0] = num;
visit[x][y][1] = i;
}
}
}
for (int i = 0; i < k; i++) {
if (virus[i].alive == 0) continue;
int x = virus[i].x;
int y = virus[i].y;
int num = virus[i].num;
if (visit[x][y][1] == i) {
virus[i].num = visit[x][y][2];
}
else {
virus[i].alive = 0;
}
}
memset(visit, 0, sizeof(visit));
/*
for (int i = 0; i < k; i++) {
cout << "i " <<i<<" "<< virus[i].x << " " << virus[i].y << " " << virus[i].num << " " << virus[i].dir << " " << virus[i].alive << endl;
}
cout << endl;
*/
time++;
}
for (int i = 0; i < k; i++) {
if (virus[i].alive == 1) {
ans += virus[i].num;
}
}
}
int main() {
int t;
scanf("%d", &t);
for (int tc = 1; tc <= t; tc++) {
ans = 0;
memset(visit, 0, sizeof(visit));
memset(virus, 0, sizeof(virus));
scanf("%d%d%d", &n, &m, &k);
for (int i = 0; i < k; i++) {
int x, y, num, dir;
scanf("%d%d%d%d", &virus[i].x, &virus[i].y, &virus[i].num, &virus[i].dir);
virus[i].alive = 1;
}
solve();
printf("#%d %d\n", tc, ans);
}
}
'알고리즘 문제풀이 > swea' 카테고리의 다른 글
[swea 2112] 보호 필름 (0) | 2020.04.24 |
---|---|
[swea 5648] 원자 소멸 시뮬레이션 (0) | 2020.04.22 |
[swea 5644] 무선 충전 (0) | 2020.04.20 |
[SWEA 5658] 보물상자 비밀번호 (0) | 2020.04.18 |
7465 창용 마을 (0) | 2019.06.05 |
Comments