작성
·
128
0
여전히 문제를 해결하지 못해 재질문 드립니다 ㅠㅠ
===================
오... ㅎㅎ 이제 모든 코드를 이해하시고 맞왜틀까지 오셨군요. ㅎㅎ
축하드립니다. 완섭님.
제가 주석을 달아봤습니다. 해당부분 참고해주세요. 감사합니다.
#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
using namespace std;
int dy[4] = { 1,0,-1,0 };
int dx[4] = { 0,-1,0,1 };
int n, m;
int arr[10][10];
int visited[10][10];
vector<pair<int, int>> h;
vector<pair<int, int>> s;
int ans = 0;
void dfs(int y,int x) {
visited[y][x] = 2;
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) continue;
// 왜 벽일 때의 로직이 없죠? 벽은 통과 못합니다. 바이러스.
if (visited[ny][nx] == 0) { dfs(ny, nx); }
}
}
void combi(int k) {
if (s.size() == 3) {
// visited라는 임시 배열에다가 arr 설정 good
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
visited[i][j] = arr[i][j];
}
}
// 벽 세우기 : good
for (int i = 0; i < 3; i++) {
visited[s[i].first][s[i].second] = 1;
}
// 바이러스면 퍼진다 : good
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if(visited[i][j] == 2) dfs(i,j);
}
}
int temp = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (visited[i][j] == 0) temp++;
}
}
ans = max(temp, ans);
return;
}
for (int i = k; i < h.size(); i++) {
s.push_back(h[i]);
combi(k + 1);
s.pop_back();
}
}
int main()
{
cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> arr[i][j];
if (arr[i][j] == 0) h.push_back({ i,j });
}
}
combi(0);
cout << ans;
}
====
이렇게 답변을 주셨었는데
http://boj.kr/c4cc788e26cf4f6f9970c6afcd0ac121
위와 같이 25번째 라인을 수정하라는 뜻으로 이해하였습니다.
하지만
1) 24번째 라인은 단순히 arr[-1][0]과 같은 곳을 참조하지 않도록 가드를 둔것이고
2) 26번째 라인에서 if문을 통해 오직 0일 때만 즉, 이미 2인 곳에 상하좌우 인접한 네칸 중 0인 곳에 한해서만 dfs를 다시 재수행 하기 때문에
25번째 라인이 사실상 무의미 하다는 생각이 들었습니다.
물론 다시 제출했지만 여전히 오답 판정을 받았습니다.
제가 저 위에 큰돌님께서 주신 답변을 제대로 이해하지 못한 것 같은데 조금만 더 구체적으로 답변 주실 수 있으실까요?
반복되는 질문에 꾸준히 답변 주셔서 진심으로 감사드립니다. (__)
(이와 비슷한 문제가 코테에 나왔을 때 제가 짠 코드대로만 제 사고방식이 흐를 것 같아 집요하게 문제점을 파악중입니다..ㅠㅠ)
답변 1
1
http://boj.kr/a8f0c40616ca4a35bf805bc6c0e81938
완섭님 코드 베이스로 수정 > 제출 > 맞았습니다. 해당 코드 보시고 공부해주세요.
완섭님코드에서 잘못된 점은 combi 함수입니다.
1. 일단 combi함수에는 index가 들어가야 합니다. 그래야 디버깅을 할 수 있어요. 완섭님의 원본 코드는 좌표인 값이 들어가죠? + combi 함수자체가 올바르지 않았어요.
- 인덱스로 변환이후 찍어보니 똑같은 인덱스가 3번 나오더군요. 34 34 34 로요. 즉, 벽을 3개를 세워야하는데 1개만 세우는 경우가 생겨버린것이죠 (인덱스 변환 후 디버깅 한번 해보세요. 원래 코드에다가)
감사합니다.
* 또 질문 생기시면 언제든 질문주세요. ㅎ
친절한 답변 감사드립니다! 2주동안 헤맸는데 dfs쪽 문제가 아니라 combi문제였네요 ㅠ_ㅠ
좀 더 개념학습을 철저히 해야겠다는 생각이 듭니다. 답변 주셔서 정말 감사드립니다!