-
백준 14890번 경사로PS 2020. 2. 19. 17:07
https://www.acmicpc.net/problem/14890
14890번: 경사로
첫째 줄에 N (2 ≤ N ≤ 100)과 L (1 ≤ L ≤ N)이 주어진다. 둘째 줄부터 N개의 줄에 지도가 주어진다. 각 칸의 높이는 10보다 작거나 같은 자연수이다.
www.acmicpc.net
<접근방법>
시뮬레이션 문제입니다.
단순하게 하나하나 구현한다면 복붙한다해도 시간이 걸릴 것 입니다.
보통 이런 문제들은 생각을 살짝 바꾼다면 하나의 모듈에 여러 상황을 담을 수 있습니다.
행 오른쪽 경사로 탐색, 행 왼쪽 경사로 탐색, 열 위쪽 경사로 탐색, 열 아래쪽 경사로 탐색
문제에서 고려해야 할 상황입니다.
행과 열은 회전만 시켜주면 똑같은 것이고
오른쪽, 왼쪽은 뒤집으면 똑같은 것 입니다.
즉, 전처리로 저렇게 해주면 탐색 모듈은 하나만 있으면 됩니다.
<코드>
#include <iostream> #include <algorithm> #include <vector> using namespace std; struct point { int y, x; }; int n, l, map[101][101]; int ans; bool check(vector<int> v, bool visit[], int type) { for (int i = 0; i < n - 1; i++) { int val = v[i]; int nval = v[i + 1]; if (nval - val > 1) return false; if (nval - val == 1) { //경사로를 놓을 길이 체크 int end; if (type == 0) end = i - l + 1; else end = i - l + 1; if (end < 0 || end >= n) return false; int start; if (type == 0) start = i; else start = i; //방문 체크 for (int j = end; j <= start; j++) { if (visit[j]) return false; } //방문 처리 for (int j = end; j <= start; j++) { visit[j] = true; } } } return true; } void simul_row(vector<int> v) { bool visit[101] = { false, }; if (!check(v, visit, 0)) return; reverse(visit, visit + n); reverse(v.begin(), v.end()); if (!check(v, visit, 0)) return; ans++; } void simul_col(vector<int> v) { bool visit[101] = { false, }; if (!check(v, visit, 1)) return; reverse(visit, visit + n); reverse(v.begin(), v.end()); if (!check(v, visit, 1)) return; ans++; } int main() { cin >> n >> l; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cin >> map[i][j]; } } for (int i = 0; i < n; i++) { vector<int> v; for (int j = 0; j < n; j++) { v.push_back(map[i][j]); } simul_row(v); } for (int j = 0; j < n; j++) { vector<int> v; for (int i = 0; i < n; i++) { v.push_back(map[i][j]); } simul_col(v); } cout << ans << '\n'; return 0; }
<느낀 점>
-구현 복잡성
반응형'PS' 카테고리의 다른 글
백준 2169번 로봇 조종하기 (0) 2020.02.24 백준 1194번 달이 차오른다, 가자 (0) 2020.02.24 백준 1938번 통나무 옮기기 (0) 2020.02.19 백준 1600번 말이 되고픈 원숭이 (0) 2020.02.19 백준 16397번 탈출 (0) 2020.02.19