-
등산 - 1486Algorithm/BOJ 2020. 2. 18. 19:4112345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364//1486 - 등산#include <iostream>#include <vector>using namespace std;#define INF 200000000int N, M, T, D;vector<vector<int>> adj, arr;int xarr[4] = {1, -1, 0, 0};int yarr[4] = {0, 0, 1, -1};void init(){cin >> N >> M >> T >> D;arr = vector<vector<int>>(N, vector<int>(M));adj = vector<vector<int>>(N*M, vector<int>(N*M, INF));char c;for(int i = 0; i<N; ++i)for(int j = 0; j<M; ++j){cin >> c;if(c > 90)c -= 6;arr[i][j] = c - 'A';}for(int i = 0; i<N; ++i)for(int j = 0; j<M; ++j){int here = i*M+j;for(int k = 0; k<4; ++k)if(i+xarr[k] >= 0 && i+xarr[k] <N && j+yarr[k] >=0 && j+yarr[k] < M){int u = arr[i][j];int v = arr[i+xarr[k]][j+yarr[k]];int there = M*(i+xarr[k]) + j+yarr[k];if(u - v > T || v - u > T)adj[here][there] = INF;else if(u < v)adj[here][there] = (v-u)*(v-u);elseadj[here][there] = 1;}}for(int k = 0; k<N*M; ++k)for(int i = 0; i<N*M; ++i)for(int j = 0; j<N*M; ++j)adj[i][j] = min(adj[i][j], adj[i][k] + adj[k][j]);}int main(){ios_base::sync_with_stdio(0);cin.tie(0);init();int ans = arr[0][0];for(int i = 1; i<N*M; ++i)if(adj[0][i] + adj[i][0] <= D)ans = max(ans, arr[i/M][i%M]);cout << ans << "\n";}
cs https://www.acmicpc.net/problem/1486
1486번: 등산
첫째 줄에 산의 세로크기 N과 가로크기 M 그리고, T와 D가 주어진다. N과 M은 25보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 지도가 주어진다. T는 52보다 작거나 같은 자연수이고, D는 1,000,000보다 작거나 같은 자연수이다.
www.acmicpc.net
등산
플로이드 와샬 문제입니다.
주어진 입력값을 인접행렬 그래프로 표현하면 됩니다!
'Algorithm > BOJ' 카테고리의 다른 글
발전소 - 1102 (0) 2020.02.23 외판원 순회 - 2098 (0) 2020.02.19 DFS와 BFS (0) 2020.02.18 거의 최단 경로 - 5719 (0) 2020.02.18 특정한 최단 경로 - 1504 (0) 2020.02.18