코딩공작소
[백준]경사로(두번) 본문
https://www.acmicpc.net/problem/14890
14890번: 경사로
첫째 줄에 N (2 ≤ N ≤ 100)과 L (1 ≤ L ≤ N)이 주어진다. 둘째 줄부터 N개의 줄에 지도가 주어진다. 각 칸의 높이는 10보다 작거나 같은 자연수이다.
www.acmicpc.net
시뮬... https://rebas.kr/788님 참고
다음계단과 현재계단을 비교하며 1계단 차이가 나야한다.
오르막길, 내리막길 두가지 상황이 있고 처음에는 오르막길을 만났을 때 뒤로 L칸 탐색, 내리막길을 만났을때 앞으로 L칸 탐색을 진행했었다.
하지만 누적해오면서 진행을 해주면 뒤로 탐색을 하지 않아도 된다.
내리막길 만큼의 L를 음수로 바까주고 cnt++을 해주다 보면 0이될 때 내리막길을 놓은것이 된다.
L가 음수일 때 끝나거나 다른 상황을 만난다면 도중에 새로운 경사로를 놓는것이므로 실패.
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
|
#include <iostream>
using namespace std;
int N, L, ans = 0;
int map[100][100];
void slope(int i, int c) {
int cnt = 1;
for (int j = 0; j < N - 1; j++) {
int d = c == 1 ? map[i][j + 1] - map[i][j] : map[j + 1][i] - map[j][i]; //행 , 열 구분
if (d == 0) cnt++; //같은 경우
else if (d == 1 && cnt >= L) cnt = 1; //오르막길
else if (d == -1 && cnt >= 0) cnt = -L + 1; //내리막길
else return;
}
if (cnt >= 0) ans++;
}
void solve() {
for (int i = 0; i < N; i++) {
slope(i,0);
slope(i,1);
}
}
int main()
{
cin >> N >> L;
for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) cin >> map[i][j];
solve();
printf("%d\n", ans);
return 0;
}
|
cs |
'알고리즘 > 시뮬레이션' 카테고리의 다른 글
[백준]색종이 (0) | 2019.09.14 |
---|---|
[백준]톱니바퀴(2) (0) | 2019.09.05 |
[SWEA]무선충전 (0) | 2019.09.01 |
[백준]미로만들기 (1) | 2019.08.23 |
[SWEA]미생물격리 (0) | 2019.08.17 |