본문 바로가기

백준

23083 꿀벌 승연이

신난다

노타빌리티에 육각 노트 써봤다

 

예전에 정사각형 개수 구하는 문제랑 비슷했다. 

재귀로 n, m부터 한 칸씩 돌아가면서 구했다. 

1, 1부터 n, m까지 경로를 구해야 하므로, 1, 1 위치만 1로 지정해서 더하게끔 했다. 

 

참고로 y가 짝수냐 홀수냐 따라서 움직일 수 있는 좌표가 달라진다.

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <map>
#include <cmath>
#include <cstring>
#include <bitset>
#include <stdio.h>
#include <math.h>
#include <sstream>
#include<cassert>
#include <climits>

#define xx first
#define yy second
#define all(x) (x).begin(), (x).end()
#define MAXV 1000000007

using namespace std;
using i64 = long long int;
using ii = pair<int, int>;
using iis = pair<int, string>;
using ii64 = pair<i64, i64>;
using iii = tuple<int, int, int>;

i64 dp[1005][1005];
int n, m;

i64 calc(int x, int y) {
    auto& res = dp[x][y];
    
    if (x < 1 || n < x || y < 1 || m < y)
        return res = 0;
    
    if (x == 1 && y == 1) {
        return res = 1;
    }
    
    if (dp[x][y] != -1)
        return dp[x][y];

    if (y % 2 == 0) {
        res = calc(x-1, y) + calc(x, y-1) + calc(x+1, y-1);
    } else {
        res = calc(x-1, y) + calc(x-1, y-1) + calc(x, y-1);
    }
    
    return res %= MAXV;
}

int main() {
    memset(dp, -1, sizeof(dp));
    
    scanf("%d %d", &n, &m);
    
    int k;
    scanf("%d", &k);
    
    for (int i = 0; i < k; i++) {
        int x, y;
        scanf("%d %d", &x, &y);
        
        dp[x][y] = 0;
    }
    
    printf("%d\n", calc(n, m));
    
    // for (int i = 1; i <= n; i++) {
    //     for (int j = 1; j <= m; j++) {
    //         printf("%lld ", dp[i][j]);
    //     }
    //     printf("\n");
    // }
    
    return 0;
}

'백준' 카테고리의 다른 글

12909 그래프 만들기  (0) 2023.02.11
24524 아름다운 문자열  (0) 2023.01.14
1242 소풍  (0) 2023.01.14
13019 A를 B로  (0) 2022.12.17
12915 대회 개최  (0) 2022.12.17