-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path14890.cpp
147 lines (143 loc) · 5.05 KB
/
14890.cpp
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
//
// Created by vkdne on 2018-04-05.
//
#include <iostream>
using namespace std;
int N,L;
int map[101][101];
int visitH[101][101];
int visitV[101][101];
int main(){
cin >> N >> L;
for(int i = 1 ; i <= N ; i++)
for(int j = 1; j <= N ; j++)
cin >> map[i][j];
int sol = 0;
//가로 검사
for(int i = 1; i <= N ; i++){
bool chk = true;
for(int j = 1; j < N && chk ; j++){
//같으면 다음거 검사
if(map[i][j] == map[i][j+1])
continue;
//다르면 검사
else{
//j+1가 j보다 크고 차이가 1
//경사로를 i+1보다 작은 곳으로
if(map[i][j+1] - map[i][j] == 1){
//경사로 길이 감당가능하면
if(j - L +1 > 0){
for(int k = j - L + 1 ; k <= j ; k++){
//낮은쪽 높이가 다르면 fail
if(map[i][k] != map[i][j] || visitH[i][k] != 0){
chk = false;
break;
}
}
for(int k = j - L + 1 ; k <= j ; k++)
visitH[i][k] =1;
}
else{
chk = false;
break;
}
}
//j가 j+1보다 크고 차이가 1
//경사로를 i+1보다 큰 곳으로
else if(map[i][j+1] - map[i][j] == -1){
//경사로 길이 감당가능하면
if(j + L <= N){
for(int k = j+1 ; k <= j + L ; k++){
//낮은쪽 높이가 다르면 fail
if(map[i][j+1] != map[i][k] || visitH[i][k] != 0){
chk = false;
break;
}
}
for(int k = j+1 ; k <= j + L ; k++)
visitH[i][k] = 1;
}
else{
chk = false;
break;
}
}
//높이차가 1보다 크면 fail 길이 아님!
else{
chk = false;
break;
}
}
}
if(chk)
sol++;
}
//세로 검사
for(int i = 1; i <= N ; i++){
bool chk = true;
for(int j = 1; j < N && chk ; j++){
//같으면 다음거 검사
if(map[j][i] == map[j+1][i])
continue;
//다르면 검사
else{
//j+1가 j보다 크고 차이가 1
//경사로를 i+1보다 작은 곳으로
if(map[j+1][i] - map[j][i] == 1){
//경사로 길이 감당가능하면
if(j - L +1 > 0){
for(int k = j - L + 1 ; k <= j ; k++){
//낮은쪽 높이가 다르면 fail
if(map[k][i] != map[j][i] || visitV[k][i] != 0){
chk = false;
break;
}
}
for(int k = j - L + 1 ; k <= j ; k++)
visitV[k][i] = 1;
}
else{
chk = false;
break;
}
}
//j가 j+1보다 크고 차이가 1
//경사로를 i+1보다 큰 곳으로
else if(map[j][i] - map[j+1][i] == 1){
//경사로 길이 감당가능하면
if(j + L <= N){
for(int k = j+1 ; k <= j + L ; k++){
//낮은쪽 높이가 다르면 fail
if(map[j+1][i] != map[k][i] || visitV[k][i] != 0){
chk = false;
break;
}
}
if((j + L + 1 <= N && map[j+L+1][i] <= map[j+1][i]) || j+L == N)
;
//경사로 바로 다음 타일의 높이가 다를때
else{
chk = false;
break;
}
for(int k = j+1 ; k <= j + L ; k++)
visitV[k][i] = 1;
}
else{
chk = false;
break;
}
}
//높이차가 1보다 크면 fail 길이 아님!
else{
chk = false;
break;
}
}
}
if(chk)
sol++;
}
cout << sol << endl;
return 0;
}