• toc {:toc}

๋ฌธ์ œ ํ™•์ธ

1103: ๊ฒŒ์ž„ ๋ฌธ์ œ ํ™•์ธํ•˜๊ธฐ

ํ’€์ด

๋™์ „์ด 4๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•˜๋ฉด์„œ ์›€์ง์ผ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

  1. ์ž…๋ ฅ์ด space๊ฐ€ ์ฃผ์–ด์ ธ์„œ ๋“ค์–ด์˜ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ•œ ๋ฒˆ์— ๋“ค์–ด์˜จ๋‹ค.
    • string์œผ๋กœ ๋ฐ›์„์ง€ int๋กœ ๋ฐ›์„์ง€ ์„ ํƒ. ๋‘˜ ๋‹ค ์ƒ๊ด€์—†๊ธด ํ•˜๋‹ค.
    • board์— ๋‚˜๋ˆˆ ์ˆซ์ž ์ €์žฅ
  2. ์ตœ๋Œ€์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ โ‡’ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํŒŒ์•…ํ•ด์„œ ์ตœ๋Œ€์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜ ์‚ฐ์ถœ (DFS)
    • ๊ฒฝ์šฐ์˜ ์ˆ˜ ์ €์žฅ์„ ์œ„ํ•ด dist ๋ฐฐ์—ด ์ƒ์„ฑํ•ด ์ด๋™ ๊ฑฐ๋ฆฌ ์ €์žฅ
    • ์›์ ์œผ๋กœ๋ถ€ํ„ฐ ๊ฐ€๋Šฅํ•œ ๋จผ ๊ณณ์œผ๋กœ ์žฌ๊ท€์ ์œผ๋กœ ์ด๋™ํ•˜๋ฉฐ -1์ธ dist๊ฐ’์„ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
    • ๋จผ ๊ณณ์—์„œ๋ถ€ํ„ฐ ์ด๋™๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์„ธ๋ฉฐ ์›์ ์œผ๋กœ ๋Œ์•„์˜ค๋Š” ๋ฐฉ์‹
  3. ๊ณ ๋ คํ•ด์•ผ ํ•˜๋Š” ์˜ˆ์™ธ ์‚ฌํ•ญ
    • ๋ฌดํ•œ๋ฒˆ ์›€์ง์ด๋Š” ๊ฒฝ์šฐ โ‡’ vis ๋กœ ๋ฐฉ๋ฌธํ•œ ๊ฒฝ์šฐ 1๋กœ ์ฒดํฌ. ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•˜๋ฉด ๋ฌดํ•œ๋ฒˆ ์ด๋™ํ•œ๋‹ค ๊ฐ€์ •
    • ๋™์ „์ด ๊ตฌ๋ฉ์— ๋น ์ง€๊ฑฐ๋‚˜ ๋ณด๋“œ ๋ฐ”๊นฅ์œผ๋กœ ๋‚˜๊ฐ€๋Š” ๊ฒฝ์šฐ
#include <bits/stdc++.h>
using namespace std;
 
int board[50][50];
int vis[50][50];
int dist[50][50];
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};
int N, M;
 
int dfs(int x, int y){
    if (board[x][y] == 0 || x < 0 || x >= N || y < 0 || y >= M) return 0;
    if (vis[x][y] == 1) {
        cout << -1 << endl;
        exit(0);
    }
    if (dist[x][y] != -1) return dist[x][y];
 
    vis[x][y] = 1;
    dist[x][y] = 0;
 
    int mat = board[x][y];
    for(int dir = 0; dir<4; dir++){
        int nx = x + dx[dir] * mat;
        int ny = y + dy[dir] * mat;
        if(dist[x][y]<dfs(nx, ny)+1){
            dist[x][y] = dfs(nx, ny)+1;
        }
    }
    vis[x][y] = 0;
    return dist[x][y];
}
 
 
int main(){
    ios::sync_with_stdio(true);
    cin.tie(0); cout.tie(0);
 
    cin >> N >> M;
    for (int row=0; row<N; row++){
        string str;
        cin >> str;
        for (int col=0; col<M; col++){
            dist[row][col] = -1;
            int val;
            if (str[col]=='H') val = 0;
            else {
                val = int(str[col]) - 48;
            }
 
            board[row][col] = val;
        }
    }
 
    int res = dfs(0,0);
 
    cout << res << endl;
 
    return 0;
}