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
- 자료구조
- 풀이
- 버킷 정렬
- 별 찍기 10
- 1764
- 백준 17822
- 5397
- 해시구현
- 백준 1406
- 조세퍼스 순열
- 시간 복잡도
- ㅣ풀이
- 구현
- 게리멘더링2
- 백준 17471
- AVL 시간 복잡도
- 백준 5397
- dfs
- c#
- Stack 이란
- 스택의 특징
- 백준 17779
- 백준 1158
- 해시 구현
- 백준
- qorwns
- 원판 돌리기
- 백준 2447
- C/C++ 구현
- heap
Archives
- Today
- Total
홍시홍의 프로그래밍
[swea 5648] 원자 소멸 시뮬레이션 본문
분류 : 구현
요구사항
원자는 이동간에 만나면 파괴된다. 파괴된 원자의 에너지 총량 구하기
풀이
1. 범위의 명확성을 위해서 +1000한다
2. 0.5 구간에서 만날 수 없으니깐 *2를 한다.
3. 이동한다 범위 넘어서면 더이상 할 필요없이 alive 0으로 설정
4. 이동한 것들 중 2개 이상겹친다면 원자 삭제
41개에서 오류가 났는데 이동 확인에서
if (atom[i].alive == 0) continue; 를 확인안해서 해멧다..
#include <iostream>
#include <string.h>
#include <vector>
using namespace std;
struct go {
int x;
int y;
int dir;
int power;
int alive;
int index;
};
go atom[1100];
int dr[4] = { 0,0,-1,1 };
int dc[4] = { 1,-1,0,0 };
int n;
int map[4400][4400];
int ans = 0;
bool check() {
for (int i = 0; i < n; i++) {
if (atom[i].alive == 1) return false;
}
return true;
}
void solve() {
int cnt = 0;
while (true) {
if (check()==true) break;
for (int i = 0; i < n; i++) {
if (atom[i].alive == 0) continue;
atom[i].x = atom[i].x + dr[atom[i].dir];
atom[i].y = atom[i].y + dc[atom[i].dir];
if (atom[i].x < 0 || atom[i].y < 0 || atom[i].x >4000 || atom[i].y>4000) {
atom[i].alive = 0;
continue;
}
int x = atom[i].x;
int y = atom[i].y;
map[x][y]++;
}
//이동한것들 검사
for (int i = 0; i < n; i++) {
int x = atom[i].x;
int y = atom[i].y;
if (atom[i].alive == 0) continue;
if (map[x][y] == 0) continue;
if (map[x][y] == 1) {
map[x][y]--;
continue;
}
if (map[x][y] >= 2) {
for (int j = 0; j < n; j++) {
if (atom[j].alive == 0) continue;
int nx = atom[j].x;
int ny = atom[j].y;
if (x == nx && ny == y) {
ans += atom[j].power;
atom[j].alive = 0;
}
}
atom[i].alive = 0;
map[x][y]= 0;
}
}
}
}
int main() {
int t;
scanf("%d", &t);
for (int tc = 1; tc <= t; tc++) {
ans = 0;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
int x, y, dir, power;
scanf("%d%d%d%d", &x, &y, &dir, &power);
atom[i].x = (x+1000)*2;
atom[i].y = (y+1000)*2;
atom[i].dir = dir;
atom[i].power = power;
atom[i].alive = 1;
atom[i].index = i;
}
solve();
if(n==0 || n==1) printf("#%d %d\n", tc, 0);
printf("#%d %d\n", tc, ans);
}
return 0;
}
'알고리즘 문제풀이 > swea' 카테고리의 다른 글
[swea 2117] 홈 방범 서비스 (0) | 2020.04.24 |
---|---|
[swea 2112] 보호 필름 (0) | 2020.04.24 |
[swea 2382] 미생물 격리 (0) | 2020.04.21 |
[swea 5644] 무선 충전 (0) | 2020.04.20 |
[SWEA 5658] 보물상자 비밀번호 (0) | 2020.04.18 |
Comments