2017년 하반기 문제인 경사로 복원 문제입니다. 문제의 설명은 굉장히 길고 그림으로 자세히 설명되어 있어 이해하기 쉽습니다. 문제의 요지를 정리해보면 다음과 같습니다.
else if (now > board[i][j]) {
int cnt = 0;
for (int k = j; k < j + l; k++) {
if (board[i][j] == board[i][k]) cnt++;
}
if (cnt != l) pass = false;
j += l - 1;
/*이하 생략*/
}
소스코드의 일부를 가져왔습니다. j += l-1을 해줌으로써, 다음 반복문 때 j++이 되어 최종적으로 l칸 만큼을 내려가게 되도록 구현하였습니다. 이렇게 해주면서 도착지점까지 문제 없이 도착했다면 길을 count 해주면 됩니다.
※해당 소스코드는 참고용이며, 최적화 된 공식 솔루션 소스가 아닙니다. 이 소스를 그대로 복사하여 이용, 또는 제출하는 행위에 대한 불이익은 책임지지 않습니다.
#include <iostream>
using namespace std;
int abs(int a) { return a < 0 ? -a : a; }
int main() {
int n, l, t = 0, now, ans = 0, board[100][100];
cin >> n >> l;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cin >> board[i][j];
for (int i = 0; i < n; i++) {
now = board[i][0];
t = 1;
bool pass = true;
for (int j = 1; j < n && pass; j++) {
if (abs(board[i][j] - now) > 1) pass = false;
else if (now > board[i][j]) {
int cnt = 0;
for (int k = j; k < j + l; k++) {
if (board[i][j] == board[i][k]) cnt++;
}
if (cnt != l) pass = false;
j += l - 1;
t = -1;
}
else if (now < board[i][j]) {
if (t < l) pass = false;
t = 0;
}
t++;
now = board[i][j];
}
if (pass) ans++;
}
for (int i = 0; i < n; i++) {
now = board[0][i];
t = 1;
bool pass = true;
for (int j = 1; j < n && pass; j++) {
if (abs(board[j][i] - now) > 1) pass = false;
else if (now > board[j][i]) {
int cnt = 0;
for (int k = j; k < j + l; k++) {
if (board[j][i] == board[k][i]) cnt++;
}
if (cnt != l) pass = false;
j += l - 1;
t = -1;
}
else if (now < board[j][i]) {
if (t < l) pass = false;
t = 0;
}
t++;
now = board[j][i];
}
if (pass) ans++;
}
cout << ans;
}