알고리즘 문제풀이/백준
[백준 14890] 경사로
홍시홍
2020. 2. 8. 16:01
https://www.acmicpc.net/problem/14890
14890번: 경사로
첫째 줄에 N (2 ≤ N ≤ 100)과 L (1 ≤ L ≤ N)이 주어진다. 둘째 줄부터 N개의 줄에 지도가 주어진다. 각 칸의 높이는 10보다 작거나 같은 자연수이다.
www.acmicpc.net
요구사항
지나다닐 수 있는 길의 수 구하기
시뮬레이션
예외처리 잘해주기
#include <iostream>
#include <deque>
#include <string.h>
#include <algorithm>
#pragma warning(disable:4996)
using namespace std;
int map[101][101];
int visit[101];
int n, l;
int ans = 0;
void garo(int r)
{
int c = 0;
while (true)
{
if (c == n - 1)
{
ans++;
break;
}
if (map[r][c] == map[r][c + 1])
{
c++;
continue;
}
else if (abs(map[r][c] - map[r][c + 1]) > 1)
break;
//현재가 클때
else if (map[r][c] - map[r][c + 1] == 1)
{
if (c + l >= n)
return;
int a = map[r][c + 1];
for (int i = c + 1; i <= c + l; i++)
{
if (visit[i] == 1)
return;
if (a == map[r][i])
{
visit[i] = 1;
continue;
}
else
return;
}
c = c + l;
continue;
}
//현재가 작을때
else if (map[r][c] - map[r][c + 1] == -1)
{
if (c - l + 1 < 0)
return;
for (int i = c; i >= c - l + 1; i--)
{
if (visit[i] == 1)
return;
if (map[r][c] == map[r][i])
{
visit[i] = 1;
continue;
}
else
return;
visit[i] = 1;
}
c++;
continue;
}
}
}
void sero(int c)
{
int r = 0;
while (true)
{
if (r == n - 1)
{
ans++;
break;
}
if (map[r][c] == map[r + 1][c])
{
r++;
continue;
}
else if (abs(map[r][c] - map[r + 1][c]) > 1)
break;
//현재가 클때
else if (map[r][c] - map[r + 1][c] == 1)
{
if (r + l >= n)
return;
int a = map[r + 1][c];
for (int i = r + 1; i <= r + l; i++)
{
if (visit[i] == 1)
return;
if (a == map[i][c])
{
visit[i] = 1;
continue;
}
else
return;
}
r = r + l;
continue;
}
//현재가 작을때
else if (map[r][c] - map[r + 1][c] == -1)
{
if (r + 1 - l < 0)
return;
for (int i = r; i >= r - l + 1; i--)
{
if (visit[i] == 1)
return;
if (map[r][c] == map[i][c])
{
visit[i] = 1;
continue;
}
else
return;
visit[i] = 1;
}
r++;
continue;
}
}
}
int main()
{
scanf("%d%d", &n, &l);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
scanf("%d", &map[i][j]);
}
}
for (int i = 0; i < n; i++)
{
memset(visit, 0, sizeof(visit));
garo(i);
memset(visit, 0, sizeof(visit));
sero(i);
}
cout << ans << endl;
}