[14890] 경사로
BOJ/SWEA2018. 3. 6. 18:11
[14890] 경사로 (http://boj.kr/14890)
right() 에서 L = 2 인경우
3 2 2 2 3
3 2 2 1 1
x x 3 2 2 (마지막 위치)
2 2 3
3 3 3
위 경우에 대해서 잘 처리해주면 된다. down() 도 마찬가지.
< 소스코드 >
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | #include <stdio.h> int N, L, ans=0; int g[101][101]; int down(int r, int c) { int curH; if(r == N-1) return 1; curH = g[r][c]; if(r+L < N && curH-g[r+L][c] == 1) { int flag = 1; for(int i=1; i<L; i++) { if(g[r+L][c] != g[r+i][c]) flag = 0; } if(flag){ if(r+L == N-1) return 1; if(g[r+L][c] == g[r+L+1][c]) return down(r+L+1, c); if(g[r+L][c] == g[r+L+1][c]+1) return down(r+L, c); } } if(r+L < N && g[r+L][c]-curH == 1) { int flag = 1; for(int i=1; i<L; i++) { if(curH != g[r+i][c]) flag = 0; } if(flag) return down(r+L, c); } if(g[r+1][c] == curH) return down(r+1, c); return 0; } int right(int r, int c) { int curH; if(c == N-1) return 1; curH = g[r][c]; if(c+L < N && g[r][c+L]-curH == 1) { int flag = 1; for(int i=1; i<L; i++) { if(curH != g[r][c+i]) flag = 0; } if(flag) return right(r, c+L); } if(c+L < N && curH-g[r][c+L] == 1) { int flag = 1; for(int i=1; i<L; i++) { if(g[r][c+L] != g[r][c+i]) flag = 0; } if(flag) { if(c+L == N-1) return 1; if(g[r][c+L] == g[r][c+L+1]) return right(r, c+L+1); if(g[r][c+L] == g[r][c+L+1]+1) return right(r, c+L); } } if(g[r][c+1] == curH) return right(r, c+1); return 0; } int main() { scanf("%d%d", &N, &L); for(int i=0; i<N; i++) for(int j=0; j<N; j++) scanf("%d", &g[i][j]); for(int i=0; i<N; i++) { if(down(0, i)) ans++; if(right(i, 0)) ans++; } printf("%d\n", ans); return 0; } | cs |
>> 깔끔하게 경우의 수를 펜으로 써가며 확인했으면 금방 했을텐데, 괜히 머릿속으로 한다고 하다가, 시간만 많이 썼다...
'BOJ > SWEA' 카테고리의 다른 글
[14889] 스타트와 링크 (0) | 2018.02.28 |
---|---|
[14888] 연산자 끼워넣기 (0) | 2018.02.27 |