17144 미세먼지 문제 질문
176
bunny
작성한 질문수 19
0
http://boj.kr/e2b03ab6671048c69e3ec52622d773a3
안녕하세요 17144 미세먼지 문제 풀다가 질문 생겨서 글 올립니다.
저는 위와 같이 작성했습니다.
예제 1번에 대한 답은 공기 청정기가 작동한 후와 동일하게 나오는데
예제 2번 부터 틀립니다.
제가 놓친 부분은 어떤 것이 있을까요?
답변 2
0
제 코드에 디버깅 코드를 붙여서 준비해봤는데요. 이런식으로 디버깅해서 해보시겠어요?
#include<bits/stdc++.h>
using namespace std;
int a[54][54], n, m, t, ret, temp[54][54];
vector<pair<int, int>> v1, v2;
int dy1[] = {0, -1, 0, 1};
int dx1[] = {1, 0, -1, 0};
int dy2[] = {0, 1, 0, -1};
int dx2[] = {1, 0, -1, 0};
void mise_go(int dy[], int dx[]){
fill(&temp[0][0], &temp[0][0] + 54 * 54, 0);
queue<pair<int, int>> q;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if(a[i][j] != -1 && a[i][j]){
q.push({i, j});
}
}
}
while(q.size()){
int y, x;
tie(y, x) = q.front(); q.pop();
int spread = a[y][x] / 5;
for(int i = 0; i < 4; i++){
int ny = y + dy[i];
int nx = x + dx[i];
if(ny < 0 || ny >= n || nx < 0 || nx >= m || a[ny][nx] == -1) continue;
temp[ny][nx] += spread;
a[y][x] -= spread;
}
}
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
a[i][j] += temp[i][j];
}
}
return;
}
vector<pair<int, int>> chung(int sy, int sx, int dy[], int dx[]){
vector<pair<int, int>> v;
int cnt = 0;
int y = sy;
int x = sx;
while(true){
int ny = y + dy[cnt];
int nx = x + dx[cnt];
if(ny == sy && nx == sx)break;
if(ny < 0 || ny >= n || nx < 0 || nx >= m){
cnt++;
ny = y + dy[cnt];
nx = x + dx[cnt];
}
if(ny == sy && nx == sx)break;
y = ny; x = nx;
v.push_back({ny, nx});
}
return v;
}
void go(vector<pair<int, int>> &v){
for(int i = v.size() - 1; i > 0; i--){
a[v[i].first][v[i].second] = a[v[i - 1].first][v[i - 1].second];
}
a[v[0].first][v[0].second] = 0;
return;
}
int main(){
cin >> n >> m >> t;
bool flag = 1;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
cin >> a[i][j];
if(a[i][j] == -1){
if(flag){
v1 = chung(i, j, dy1, dx1);
flag = false;
}else v2 = chung(i, j, dy2, dx2);
}
}
}
while(t--){
mise_go(dy1, dx1);
go(v1);
go(v2);
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
cout << a[i][j] << " ";
}
cout << '\n';
}
cout << "turn\n";
}
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if(a[i][j] != -1)ret += a[i][j];
}
}
cout << ret << "\n";
}
1-E질문입니다!
0
508
2
3-L 틀린 부분 피드백 부탁드립니다.
0
811
2
1-A문제 순열재귀함수 질문입니다.
0
376
1
1-A 일곱난쟁이문제입니다
0
451
1
문제 풀 때 방향성에 대해
0
793
1
맥에서 vs code로 실행 관련 질문입니다
0
515
1
17071번 메모리 초과
0
381
1
1-C질문입니다!
0
411
2
2-B BFS 시간초과질문
0
622
2
1-O 13번 라인
0
434
1
6-J 놀이공원 문제 질문
0
375
1
구현관련 질문
0
478
1
강의 교안
0
313
1
실력을 더 올리고나서 강의를 보는 것이 맞을까요?
0
541
1
안녕하세요! 재귀함수에 관해서 질문드립니다
0
531
1
1-K
0
468
2
3-G번 질문있습니다.
1
464
3
3-C 실행 시간 질문드립니다.
0
489
1
4-A 문제 풀이 질문있습니다.
0
586
2
비트마스킹 연산자 "1의 보수" 영문 표기법
0
430
1
격자탐색 문제에서 BFS 시간복잡도 질문드립니다.
0
329
1
3-O go 함수 질문 드립니다.
1
437
2
4-A 출력 질문
0
298
1
1주차 1-O 질문드립니다
0
250
1





