Notice
Recent Posts
Recent Comments
«   2024/12   »
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
Archives
Today
Total
관리 메뉴

블로그 언저리인 무언가

[백준/BOJ] 1577 도로의 개수 본문

Programming/BOJ

[백준/BOJ] 1577 도로의 개수

he1fire 2020. 9. 28. 03:27
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
Comments