⭐️ DFS로 풀이
(x,y)
값이 0 이거나 out of index
가 아니라면 (x,y) 자리에서 이어서 탐색-1
return 하고 exit(0)
으로 바로 끝내버리기(x,y)
방문 처리다음 칸 dfs 결과 + 1
과 ans 중에서 최대값 저장(x,y)
가 더 이상 탐색할 수 없는 경우라도 해당 위치까지는 count 해야하는데 이 경우, 경로 count 되기 전에 return 되기 때문에 더해주는 것(x,y)
방문 해제틀린건지 시간초과인지
최대 이동 횟수를 변수에 저장하는 것이 아니라 DP로 기록해가면서 풀이해야 함
❗️ ans 대신 DP 사용
(x,y)
에 대한 ans 값을 DP에 저장해 두는 원리(x,y)
에 저장된 dp 값을 return 해서 사용#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
int board[51][51];
bool visit[51][51];
int dp[51][51];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,-1,1};
int n,m;
int dfs(int x, int y) {
// out of index
if(x<0 || x>=n || y<0 || y>=m || board[x][y]==0) return 0;
// loop 발생 -> -1 출력하고 바로 죽여버리기
if(visit[x][y]) {
cout << -1;
exit(0);
}
// 이미 방문했을 경우 return
if(dp[x][y]!=-1) return dp[x][y];
visit[x][y]=true;
dp[x][y]=0;
for (int i=0; i<4; i++) {
int nx=x+dx[i]*board[x][y];
int ny=y+dy[i]*board[x][y];
dp[x][y]=max(dp[x][y], dfs(nx, ny)+1); // out of index도 거리에 count
}
// 다른 방향 탐색 위해 visit 풀어주기
visit[x][y]=false;
// 최종적 ans return 위해
return dp[x][y];
}
int main() {
ios_base::sync_with_stdio(false); cout.tie(NULL); cin.tie(NULL);
cin >> n >> m;
for(int i=0;i<n;i++) {
string s;
cin >> s;
for(int j=0;j<m;j++) {
if(s[j]=='H') board[i][j]=0;
else board[i][j]=s[j]-'0';
}
}
memset(dp, -1, sizeof(dp));
cout << dfs(0,0);
}