-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #85 from HYU-PS-STUDY/wonkyDD
[week-12] 3190, 16235
- Loading branch information
Showing
3 changed files
with
250 additions
and
0 deletions.
There are no files selected for viewing
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,133 @@ | ||
#include <iostream> | ||
#include <vector> | ||
#include <queue> | ||
#include <algorithm> | ||
#define PLANE_MAX 11 | ||
using namespace std; | ||
int dy[] = {-1, -1, -1, 0, 0, 1, 1, 1}; | ||
int dx[] = {-1, 0, 1, -1, 1, -1, 0, 1}; | ||
|
||
|
||
int N,M,K; | ||
|
||
// NOTE : 매 겨울 채워지는 양분의 양 | ||
int plane[PLANE_MAX][PLANE_MAX]; | ||
|
||
// NOTE : 각 칸의 양분 상태 | ||
int nutrient[PLANE_MAX][PLANE_MAX]; | ||
|
||
/** | ||
* NOTE | ||
* - 각 칸에는 여러 개의 나무가 담길 수 있다 | ||
* - 나무의 나이가 담기게 된다 | ||
*/ | ||
vector<int> tree[PLANE_MAX][PLANE_MAX]; | ||
|
||
bool age_cmp(int a1, int a2) { | ||
return a1 < a2; | ||
} | ||
|
||
bool check_bound(int y, int x) { | ||
return y>=1 && y<=N && x>=1 && x<=N; | ||
} | ||
|
||
void spring_and_summer() { | ||
// spring | ||
for (int y=1; y<=N; ++y) { | ||
for (int x=1; x<=N; ++x) { | ||
if (tree[y][x].empty()) continue; | ||
|
||
// NOTE : 가장 어린 나무가 먼저 양분을 먹는다 | ||
sort(tree[y][x].begin(), tree[y][x].end(), age_cmp); | ||
|
||
// NOTE : 양분을 섭취하고 나이가 먹은 나무들의 나이가 담긴다 | ||
vector<int> tmp; | ||
|
||
int die = 0; | ||
|
||
for (int i=0; i<tree[y][x].size(); ++i) { | ||
int age = tree[y][x][i]; | ||
|
||
if (nutrient[y][x] < age) { | ||
die += age/2; | ||
} | ||
else { | ||
nutrient[y][x] -= age; | ||
tmp.push_back(age+1); | ||
} | ||
} | ||
|
||
tree[y][x].clear(); | ||
for (const auto& n : tmp) { | ||
tree[y][x].push_back(n); | ||
} | ||
|
||
// summer | ||
nutrient[y][x] += die; | ||
} | ||
} | ||
} | ||
|
||
void fall() { | ||
for (int y=1; y<=N; ++y) { | ||
for (int x=1; x<=N; ++x) { | ||
if (tree[y][x].empty()) continue; | ||
|
||
for (int t=0; t<tree[y][x].size(); ++t) { | ||
// NOTE : 나이가 5의 배수여야 번식 가능하다 | ||
if (tree[y][x][t]%5 != 0) continue; | ||
|
||
for (int i=0; i<8; ++i) { | ||
int ny=y+dy[i], nx=x+dx[i]; | ||
if (!check_bound(ny, nx)) continue; | ||
tree[ny][nx].push_back(1); | ||
} | ||
} | ||
} | ||
} | ||
} | ||
|
||
void winter() { | ||
for (int i=1; i<=N; ++i) { | ||
for (int j=1; j<=N; ++j) { | ||
nutrient[i][j] += plane[i][j]; | ||
} | ||
} | ||
} | ||
|
||
int answer() { | ||
int cnt = 0; | ||
for (int i=1; i<=N; ++i) { | ||
for (int j=1; j<=N; ++j) { | ||
if (tree[i][j].empty()) continue; | ||
cnt += tree[i][j].size(); | ||
} | ||
} | ||
return cnt; | ||
} | ||
|
||
int main() { | ||
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr); | ||
|
||
cin >> N >> M >> K; | ||
for (int i=1; i<=N; ++i) { | ||
for (int j=1; j<=N; ++j) { | ||
cin >> plane[i][j]; | ||
nutrient[i][j] = 5; | ||
} | ||
} | ||
|
||
int y,x,age; | ||
for (int i=0; i<M; ++i) { | ||
cin >> y >> x >> age; | ||
tree[y][x].push_back(age); | ||
} | ||
|
||
while (K--) { | ||
spring_and_summer(); | ||
fall(); | ||
winter(); | ||
} | ||
cout << answer(); | ||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,117 @@ | ||
#include <iostream> | ||
#include <unordered_map> | ||
#include <deque> | ||
using namespace std; | ||
#define BOARD_MAX 101 | ||
|
||
struct snake { | ||
int y; int x; | ||
}; | ||
|
||
// NOTE : Up, Down, Left, Right 순서 | ||
int dy[] = {-1, 1, 0, 0}; | ||
int dx[] = {0, 0, -1, 1}; | ||
|
||
int N,K,L; | ||
unordered_map<int, char> time_to_dir; | ||
bool apple[BOARD_MAX][BOARD_MAX]; | ||
|
||
// NOTE : front: 꼬리, back: 머리 | ||
deque<snake> dq; | ||
// NOTE : 뱀은 처음에 오른쪽을 향한다. | ||
int dir=3; | ||
bool game_over; | ||
|
||
int dir_converter(char c) { | ||
if (c == 'L') { | ||
if (dir == 0) return 2; | ||
if (dir == 1) return 3; | ||
if (dir == 2) return 1; | ||
if (dir == 3) return 0; | ||
} | ||
|
||
if (c == 'D') { | ||
if (dir == 0) return 3; | ||
if (dir == 1) return 2; | ||
if (dir == 2) return 0; | ||
if (dir == 3) return 1; | ||
} | ||
|
||
return -1; | ||
} | ||
|
||
bool check_bound(int y, int x) { | ||
return y>=1 && y<=N && x>=1 && x<=N; | ||
} | ||
|
||
bool check_itself(int y, int x) { | ||
for (const auto& p : dq) { | ||
if (p.y == y && p.x == x) return false; | ||
} | ||
return true; | ||
} | ||
|
||
void rotate(int time) { | ||
char l_or_d = time_to_dir[time]; | ||
dir = dir_converter(l_or_d); | ||
} | ||
|
||
void move() { | ||
// NOTE : dq.back == 머리, dq.front == 꼬리 | ||
int ny = dq.back().y+dy[dir], nx = dq.back().x+dx[dir]; | ||
|
||
// NOTE : 만약 벽이나 자기자신의 몸과 부딪히면 게임이 끝난다 | ||
if (!check_bound(ny, nx) || !check_itself(ny, nx)) { | ||
game_over = true; | ||
return; | ||
} | ||
|
||
dq.push_back({ny, nx}); | ||
|
||
// NOTE : 만약 이동한 칸에 사과가 있다면, 그 칸에 있던 사과가 없어지고 꼬리는 움직이지 않는다 | ||
if (apple[ny][nx]) { | ||
apple[ny][nx] = false; | ||
} | ||
// NOTE : 만약 이동한 칸에 사과가 없다면, 몸길이를 줄여서 꼬리가 위치한 칸을 비워준다. 즉, 몸길이는 변하지 않는다. | ||
else { | ||
for (int i=0; i<dq.size()-1; ++i) { | ||
dq[i].y = dq[i+1].y; | ||
dq[i].x = dq[i+1].x; | ||
} | ||
dq.pop_back(); | ||
} | ||
} | ||
|
||
int main() { | ||
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr); | ||
|
||
cin >> N >> K; | ||
int r,c; | ||
for (int i=0; i<K; ++i) { | ||
cin >> r >> c; | ||
apple[r][c] = true; | ||
} | ||
cin >> L; | ||
int t; char d; | ||
for (int i=0; i<L; ++i) { | ||
cin >> t >> d; | ||
time_to_dir.insert({t, d}); | ||
} | ||
|
||
int time = 0; | ||
dq.push_back({1, 1}); | ||
while (1) { | ||
game_over = false; | ||
|
||
// NOTE : 먼저 뱀은 몸길이를 늘려 머리를 다음칸에 위치시킨다 | ||
move(); | ||
++time; | ||
|
||
if (game_over) break; | ||
|
||
// NOTE : 방향을 전환해야 하는 순간이면 전환한다 | ||
if (time_to_dir.find(time) != time_to_dir.end()) rotate(time); | ||
} | ||
cout << time; | ||
return 0; | ||
} |