BOJ 1103 :: 게임
문제 링크 : https://www.acmicpc.net/problem/1103
DFS + DP 방식으로 문제를 풀었다!
나는 두 가지 처리를 못해서 혼자 힘으로 풀지 못했다..
1) dp 배열 안에 저장된 값이 있을 때 그것을 이용하기.
값이 있으면 바로 그 값을 return 해 주면 되는데 이 부분을 고려하지 않았다.
2) count하는 부분.
난 dfs의 인자로 count를 주어서 풀이하려고 했는데 계속 틀렸습니다. 가 떴다.
결과적으로 인자를 제외하고 코드를 변형시켰더니 맞았는데 이 부분은 내가 자세하게 파고들어서 왜 틀렸는지 알아내야 한다.. 아직 잘 모르겠다.
원래는 이 부분이
// 범위를 넘어갈 때
if (x < 0 || x >= N || y < 0 || y >= M)
return 0;
// 구멍에 빠질 때
if (board[x][y] == 'H')
return 0;
...
int val = dfs(mx, my)+1;
이와 같았다.
// 범위를 넘어갈 때
if (x < 0 || x >= N || y < 0 || y >= M)
return count;
// 구멍에 빠질 때
if (board[x][y] == 'H')
return count;
...
int val = dfs(mx, my, count+1);
dp로 했을 때의 장점을 살리지 못하고 무작정 코드를 짜서 내가 처리하지 못한 조건을 찾지 못한 것 같다 ㅠㅠ
짜면서도 이게 왜 더 효율적인가.. 알쏭달쏭 하더니..ㅠㅠ dp에 저장된 값을 이용하지 않았기 때문에 짜면서도 이상한 것이었다.. @@@@
생각을 하고 코딩하자!!!!!!!ㅎ.ㅎ
***
너무 힘들어서...
내일 설명 추가하겠음!!!!
나의 코드
Github : https://github.com/j2wooooo/Daliy_Algorithms/blob/master/Daliy_Algorithms/BOJ_1103/BOJ_1103.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | // 백준알고리즘 1103번 :: 게임 // 접근은 맞았으나 계속 틀림. // 틀린 원인 : dp에 값이 있을 때, 바로 return 해주지 않았다. => 시간초과 // return count; dfs(x, y, count+1); 로 풀었는데 틀렸습니다가 나왔다 // 다른 사람의 코드를 참고하여 return 0; dfs(x,y)+1; 로 바꾸었는데 원인을 아직 정확히 파악하지 못했다. // *** 래퍼런스 변수 사용 익히기 #include<iostream> #include<string> #include<memory.h> #define max(a,b) a > b ? a: b using namespace std; int N, M; int cycle = 0; char board[50][50]; int dp[50][50] = {-1,}; int visited[50][50]; int dx[4] = { -1,1,0,0 }; int dy[4] = { 0,0,-1,1 }; int dfs(int x,int y) { // 범위를 넘어갈 때 if (x < 0 || x >= N || y < 0 || y >= M) return 0; // 구멍에 빠질 때 if (board[x][y] == 'H') return 0; // 방문한 곳을 다시 방문할 때 if (visited[x][y]) { cout << "-1"; exit(0); } int &ret = dp[x][y]; if (ret != -1) return ret; visited[x][y] = 1; for (int i = 0; i < 4; i++) { int mx = x + (board[x][y] - '0')*dx[i]; int my = y + (board[x][y] - '0')*dy[i]; int val = dfs(mx, my)+1; ret = max(ret, val); } visited[x][y] = 0; return ret; } int main() { string str; cin >> N >> M; memset(dp, -1, sizeof(dp)); for (int i = 0; i < N; i++) { cin >> str; for (int j = 0; j < M; j++) { board[i][j] = str[j]; } } cout << dfs(0,0); return 0; } | cs |
'Problem > DP' 카테고리의 다른 글
[C/C++] BOJ 2306 :: 유전자 (0) | 2019.02.19 |
---|---|
[C/C++] BOJ 1890 :: 점프 (0) | 2019.02.14 |
[C/C++] BOJ 14925 :: 목장 건설하기 (0) | 2019.02.05 |
[C/C++] BOJ 11727 :: 2×n 타일링 2 (0) | 2019.01.13 |
[C/C++] BOJ 11726 :: 2×n 타일링 (0) | 2019.01.13 |