작성자 없음
작성자 정보가 삭제된 글입니다.
작성
·
433
·
수정됨
0
정말 사소한 질문일 수도 있는데요
2636번 치즈 문제에서 dfs(go함수)를 들어갔을때 치즈면(1이면) return해서 dfs(go함수)가 종료되잖아요? 그럼 다시 dfs(go함수)에 들어가려면 cnt가 올라야 하는데 디버깅을 해보면 cnt는 왜 123 최대치가 3까지밖에 안오를까요??!?? 제가 어디서 헤메고 있을까요?!?? ㅜㅜㅜ
답변 4
0
정답코드를 보고 왜 이렇게 짜야지 정답일까를 보고 있었는데 (처음 의문) if문에서 return이 되면 go함수가 종료되는것으로 이해하고 있는데 그럼 다시 go함수를 어떻게 반복하지? >> while문이 반복되는건가? >> cnt가 근데 왜 최대 3번까지만 돌아가지? >> 여기서 약간 멘붕이 와서 질문했다가 >> for문에서는 상하좌우 4번을 돌리고 if문에서 return되는것은 상하좌우중 한가지만 리턴이고 다시 go함수(dfs)가 작동되는건가 해서 질문남겼습니다!! ㅜㅜ
음.. 근데 이거는 디버깅하면서 출력해보면 알 수 있는건데요. 제가 재밌게 디버깅코드를 추가해봤어요. 참고부탁드립니다.
#include <bits/stdc++.h>
using namespace std;
int a[104][104], visited[104][104];
const int dy[] = {-1, 0, 1, 0};
const int dx[] = {0, 1, 0, -1};
int n, m, cnt, cnt2;
vector<pair<int, int>> v;
void go(int y, int x){
visited[y][x] = 1;
if(a[y][x] == 1){
v.push_back({y, x});
return;
}
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 || visited[ny][nx]) continue;
go(ny,nx);
}
return;
}
int main(){
cin >> n >> m;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
cin >> a[i][j];
}
}
while(true){
cout << "WHILE문작동\n";
cnt2 = 0;
fill(&visited[0][0], &visited[0][0] + 104 * 104, 0);
v.clear();
go(0, 0);
cout << "gogo : " << v.size() << "\n";
for(pair<int, int> b : v){
cnt2++;
a[b.first][b.second] = 0;
}
bool flag = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if(a[i][j] != 0) flag = 1;
}
}
cout << "히익 flag : " << flag << "\n";
cnt++;
cout << "cnt : " << cnt << "\n";
if(!flag) break;
}
cout << cnt << '\n' << cnt2 << '\n';
return 0;
}
/*
WHILE문작동
gogo : 31
히익 flag : 1
cnt : 1
WHILE문작동
gogo : 22
히익 flag : 1
cnt : 2
WHILE문작동
gogo : 5
히익 flag : 0
cnt : 3
3
5
*/
0
go 함수가 실행되면 (y,x)좌표가 4방향으로 탐색할때, 상, 우, 하, 좌 를 탐색하는데 예를 들어 상을 탐색할 때는 1이 아니라 go(ny,nx)형태로 넣는다고 하고, 우를 탐색할때 1이면 '녹일 치즈의 위치'를 가지는 v에 넣어주고 리턴합니다. 그럼 상, 우,는 끝났고 아직 하, 좌 가 남았으니 계속 실행합니다.
저도 배우는 입장이라 틀렸을 수도 있지만 제가 이해한 논리는 그렇습니다!
0
0
https://www.acmicpc.net/source/53830318
여기있습니당!!