# 589 라운드 Codeforces은 (사업부. 2) B.는 그리드를 작성

링크 :

https://codeforces.com/contest/1228/problem/B

질문의 의미 :

빈 또는 전체 세포로 구성된 그리드 w × 아이 가정하자. 의 몇 가지 정의를 만들어 보자 :

RI는 i 행 (1≤i≤h)의 좌측에 연결되어 연속적 전체 세포의 수이다. i 번째 행의 최 좌측 셀이 비어 있으면 특히, RI = 0.
CJ는 j 번째 열 (1≤j≤w)의 상단부에 연결된 연속 된 전체 세포의 수이다. 특히, CJ = 0에서 j 번째 열의 최상위 셀이 비어있는 경우.
즉, i 번째 행은 정확하게 리 전체 세포로 시작합니다. 마찬가지로 j 번째 열은 정확히 CJ 전체 셀 시작한다.

다음은 몇 가지 3 × 4 격자의 R 및 C 값입니다. 블랙 세포가 가득과 흰색 세포가 비어 있습니다.
당신은 R과 C의 값을 갖는다. 처음에는 모든 셀이 비어 있습니다. R과 C의 값을 만족시키기 위해 그리드 셀을 채울 수있는 방법의 수를 찾을 수 있습니다. 응답이 매우 클 수 있기 때문에, 응답 모듈 1,000,000,007 (109 + 7) 발견. 즉, 1,000,000,007 (109 + 7)에 의한 응답의 분할 후에 나머지를 검색.

아이디어 :

사례 하나 하나가 걸릴 수 있습니다, 각각의 위치를 ​​열거합니다.

코드 :

#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9+7;

int r[1100], c[1100];
int h, w;

bool Check(int x, int y, int op)
{
    if (y == 1 && r[x] == 0 && op == 1)
        return false;
    if (x == 1 && c[y] == 0 && op == 1)
        return false;
    if (y == r[x]+1 && op == 1)
        return false;
    if (x == c[y]+1 && op == 1)
        return false;
    if (y <= r[x] && op == 0)
        return false;
    if (x <= c[y] && op == 0)
        return false;
    return true;
}

int main()
{
    cin >> h >> w;
    for (int i = 1;i <= h;i++)
        cin >> r[i];
    for (int i = 1;i <= w;i++)
        cin >> c[i];
    int res = 1;
    for (int i = 1;i <= h;i++)
    {
        for (int j = 1;j <= w;j++)
        {
            int tmp = 0;
            if (Check(i, j, 0))
                tmp++;
            if (Check(i, j, 1))
                tmp++;
//            cout << i << ' ' << j << ' ' << tmp << endl;
            res = (res*tmp)%MOD;
        }
    }
    printf("%d\n", res);

    return 0;
}

추천

출처www.cnblogs.com/YDDDD/p/11619597.html