-
dfs를 이용한 완탐시, 방문 해제 모두 하고 return true실수모음 2023. 10. 24. 18:05
9944번: NxM 보드 완주하기
N×M 보드 위에서 할 수 있는 게임이 있다. 보드는 크기가 1×1인 정사각형 칸으로 나누어져 있다. 보드의 각 칸은 빈 칸 또는 장애물이다. 장애물은 아래 그림에선 어두운 사각형으로 표시되어져
www.acmicpc.net
틀린 코드(42번째 줄에서 바로 return true 하면 안됨)
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485#include <bits/stdc++.h>#define endl '\n' // don't use when you cover interactive problem#define all(v) v.begin(), v.end()#define MAX 31#define INF 1000#define AVAIL '.'#define WALL '*'using namespace std;typedef pair<int, int> pi;int N, M;int ANS, FULL;char d[MAX][MAX];int dr[]{0, 1, 0, -1};int dc[]{1, 0, -1, 0};bool avail(int r, int c){if(r < 0 || r >= N || c < 0 || c >= M || d[r][c] == WALL) return false;else return true;}bool dfs(int cr, int cc, int dep, int acc){if(acc+1 == FULL){ANS = min(ANS, dep);return true;}for(int i = 0; i < 4; i++){if(!avail(cr+dr[i], cc+dc[i])) continue;int nr = cr;int nc = cc;while(avail(nr+dr[i], nc+dc[i])){d[nr][nc] = WALL;acc += 1;nr += dr[i];nc += dc[i];}if(dfs(nr, nc, dep+1, acc)) return true;while(cr != nr || cc != nc){nr -= dr[i];nc -= dc[i];d[nr][nc] = AVAIL;acc -= 1;}}return false;}int main() {ios::sync_with_stdio(false), cin.tie(0);int T = 1;while(cin >> N >> M){int cur_full = 0;for(int r = 0; r < N; r++){string tmp; cin >> tmp;for(int c = 0; c < M; c++){d[r][c] = tmp[c];if(d[r][c] == AVAIL) cur_full += 1;}}ANS = INF;FULL = cur_full;for(int r = 0; r < N; r++){for(int c = 0; c < M; c++){if(d[r][c] == WALL) continue;dfs(r, c, 0, 0);}}cout << "Case " << T << ": " << ((ANS == INF)? -1: ANS) << endl;T += 1;}return 0;}cs반례 출처 : https://www.acmicpc.net/board/view/35161
10 10
.........*
......*..*
..***.*..*
..***....*
..****...*
..****...*
..****...*
..****...*
.........*
.........*
// Case 1: 11맞은 코드
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788#include <bits/stdc++.h>#define endl '\n' // don't use when you cover interactive problem#define all(v) v.begin(), v.end()#define MAX 31#define INF 1000#define AVAIL '.'#define WALL '*'using namespace std;typedef pair<int, int> pi;int N, M;int ANS, FULL;char d[MAX][MAX];int dr[]{0, 1, 0, -1};int dc[]{1, 0, -1, 0};bool avail(int r, int c){if(r < 0 || r >= N || c < 0 || c >= M || d[r][c] == WALL) return false;else return true;}bool dfs(int cr, int cc, int dep, int acc){if(acc+1 == FULL){ANS = min(ANS, dep);return true;}for(int i = 0; i < 4; i++){if(!avail(cr+dr[i], cc+dc[i])) continue;bool flag = false;int nr = cr;int nc = cc;while(avail(nr+dr[i], nc+dc[i])){d[nr][nc] = WALL;acc += 1;nr += dr[i];nc += dc[i];}if(dfs(nr, nc, dep+1, acc)) flag = true;while(cr != nr || cc != nc){nr -= dr[i];nc -= dc[i];d[nr][nc] = AVAIL;acc -= 1;}if(flag) return true;}return false;}int main() {ios::sync_with_stdio(false), cin.tie(0);int T = 1;while(cin >> N >> M){int cur_full = 0;for(int r = 0; r < N; r++){string tmp; cin >> tmp;for(int c = 0; c < M; c++){d[r][c] = tmp[c];if(d[r][c] == AVAIL) cur_full += 1;}}ANS = INF;FULL = cur_full;for(int r = 0; r < N; r++){for(int c = 0; c < M; c++){if(d[r][c] == WALL) continue;dfs(r, c, 0, 0);}}cout << "Case " << T << ": " << ((ANS == INF)? -1: ANS) << endl;T += 1;}return 0;}cs'실수모음' 카테고리의 다른 글
테스트케이스가 있는 문제에서 배열 초기화는 사용한 만큼만 하자 (0) 2023.11.15 부동소수점 sqrt 연산은 정확하지 않다 (0) 2023.10.27 또~~~~ 버 플로우(경우를 세는 경우 오버플로우 날 수 있다) (2) 2023.10.17 지문을 멋대로 해석해버린 예시 (0) 2023.09.22 [c++] round(-0.3)은 -0을 출력한다. 조심할 것 (0) 2023.09.05