블로그 언저리인 무언가
[백준/BOJ] 1577 도로의 개수 본문
728x90
문제 : 1577 도로의 개수
1577번: 도로의 개수
첫째 줄에 도로의 가로 크기 N과 세로 크기 M이 주어진다. N과 M은 100보다 작거나 같은 자연수이고, 둘째 줄에는 공사중인 도로의 개수 K가 주어진다. K는 0보다 크거나 같고, 100보다 작거나 같은 ��
www.acmicpc.net
도시의 크기가 주어지고 공사 중인 도로의 크기가 주어졌을 때,
(0,0)에서 (N, M)까지 가는 경우의 수를 출력하는 문제이다.
도로가 정상적일 때 현재 위치기준 왼쪽+아래가 경우의 수 이므로
공사중인 도로인지 아닌지 체크하며 DP 배열을 채우면 된다.
Code
#include <bits/stdc++.h>
#define ll long long
using namespace std;
struct ABC{
ll a, b, c, d;
ABC(){}
ABC(ll a, ll b, ll c, ll d) : a(a), b(b), c(c), d(d) {}
};
bool operator<(ABC x, ABC y){
if (x.a<y.a || (x.a==y.a && (x.b<y.b || (x.b==y.b && (x.c<y.c || (x.c==y.c && x.d<y.d))))))
return 1;
else
return 0;
}
ll N, M, K, DP[105][105];
vector<ABC> arr;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> M >> K;
while (K--){
ll a, b, c, d;
cin >> a >> b >> c >> d;
if (a>c || (a==c && b>d))
arr.push_back({a,b,c,d});
else
arr.push_back({c,d,a,b});
}
DP[0][0]=1;
sort(arr.begin(),arr.end());
for (int i=0;i<=N;i++){
for (int j=0;j<=M;j++){
if (i-1>=0 && !binary_search(arr.begin(),arr.end(),ABC(i,j,i-1,j)))
DP[i][j]+=DP[i-1][j];
if (j-1>=0 && !binary_search(arr.begin(),arr.end(),ABC(i,j,i,j-1)))
DP[i][j]+=DP[i][j-1];
}
}
cout << DP[N][M];
return 0;
}
728x90
'Programming > BOJ' 카테고리의 다른 글
[백준/BOJ] 17251 힘 겨루기 (0) | 2020.09.29 |
---|---|
[백준/BOJ] 2879 코딩은 예쁘게 (0) | 2020.09.28 |
[백준/BOJ] 14370 전화번호 수수께끼 (Large) (0) | 2020.09.27 |
[백준/BOJ] 4388 받아올림 (0) | 2020.09.27 |
[백준/BOJ] 9370 미확인 도착지 (0) | 2020.09.26 |
Comments