Submission #434009


Source Code Expand

#include <iostream>
#include <cstdio>
#include <cassert>
#include <cstring>
#include <vector>
#include <valarray>
#include <array>
#include <queue>
#include <set>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <algorithm>
#include <cmath>
#include <complex>
#include <random>

using namespace std;
typedef long long ll;
typedef unsigned long long ull;

const int MD = 1e9+7;

int dp[1<<20][25];
bool pri[5][5];
bool used[5][5];
int xp[25], yp[25];

int dfs(int p) {
    if (p == 25) {
        return 1;
    }
    if (xp[p] != -1) {
        int i = yp[p], j = xp[p];
        if (1 <= i && i <= 3) {
            if (used[i-1][j] && !used[i+1][j]) {
                return 0;
            }
            if (!used[i-1][j] && used[i+1][j]) {
                return 0;
            }
        }
        if (1 <= j && j <= 3) {
            if (used[i][j-1] && !used[i][j+1]) {
                return 0;
            }
            if (!used[i][j-1] && used[i][j+1]) {
                return 0;
            }
        }
        used[i][j] = true;
        int sm = dfs(p+1);
        used[i][j] = false;
        return sm;
    }

    int u = 0;
    int mp = 0;
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {
            if (pri[i][j]) continue;
            if (used[i][j]) {
                mp |= (1<<u);
            }
            u++;
        }
    }
    if (dp[mp][p] != -1) return dp[mp][p];

    int sm = 0;
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {
            if (pri[i][j]) continue;
            if (used[i][j]) continue;
            if (1 <= i && i <= 3) {
                if (used[i-1][j] && !used[i+1][j]) {
                    continue;
                }
                if (!used[i-1][j] && used[i+1][j]) {
                    continue;
                }
            }
            if (1 <= j && j <= 3) {
                if (used[i][j-1] && !used[i][j+1]) {
                    continue;
                }
                if (!used[i][j-1] && used[i][j+1]) {
                    continue;
                }
            }
            used[i][j] = true;
            sm += dfs(p+1);
            sm %= MD;
            used[i][j] = false;
        }
    }
    return dp[mp][p] = sm;
}

int main() {
    memset(xp, -1, sizeof(xp));
    memset(yp, -1, sizeof(yp));
    memset(dp, -1, sizeof(dp));
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {
            int d;
            cin >> d; d--;
            if (d != -1) {
                xp[d] = j;
                yp[d] = i;
                pri[i][j] = true;
            }
        }
    }
    cout << dfs(0) << endl;
    return 0;
}

Submission Info

Submission Time
Task D - 25個の整数
User yosupo
Language C++11 (GCC 4.9.2)
Score 100
Code Size 2789 Byte
Status AC
Exec Time 649 ms
Memory 103328 KB

Judge Result

Set Name Sample Subtask1 Subtask2
Score / Max Score 0 / 0 30 / 30 70 / 70
Status
AC × 4
AC × 19
AC × 29
Set Name Test Cases
Sample sample-01.txt, sample-02.txt, sample-03.txt, sample-04.txt
Subtask1 sample-01.txt, sample-02.txt, sample-03.txt, sample-04.txt, test-1-01.txt, test-1-02.txt, test-1-03.txt, test-1-04.txt, test-1-05.txt, test-1-06.txt, test-1-07.txt, test-1-08.txt, test-1-09.txt, test-1-10.txt, test-1-11.txt, test-1-12.txt, test-1-13.txt, test-1-14.txt, test-1-15.txt
Subtask2 sample-01.txt, sample-02.txt, sample-03.txt, sample-04.txt, test-1-01.txt, test-1-02.txt, test-1-03.txt, test-1-04.txt, test-1-05.txt, test-1-06.txt, test-1-07.txt, test-1-08.txt, test-1-09.txt, test-1-10.txt, test-1-11.txt, test-1-12.txt, test-1-13.txt, test-1-14.txt, test-1-15.txt, test-2-01.txt, test-2-02.txt, test-2-03.txt, test-2-04.txt, test-2-05.txt, test-2-06.txt, test-2-07.txt, test-2-08.txt, test-2-09.txt, test-2-10.txt
Case Name Status Exec Time Memory
sample-01.txt AC 214 ms 103200 KB
sample-02.txt AC 216 ms 103152 KB
sample-03.txt AC 212 ms 103196 KB
sample-04.txt AC 213 ms 103204 KB
test-1-01.txt AC 213 ms 103200 KB
test-1-02.txt AC 213 ms 103076 KB
test-1-03.txt AC 212 ms 103080 KB
test-1-04.txt AC 213 ms 103068 KB
test-1-05.txt AC 212 ms 103200 KB
test-1-06.txt AC 213 ms 103080 KB
test-1-07.txt AC 213 ms 103076 KB
test-1-08.txt AC 214 ms 103200 KB
test-1-09.txt AC 209 ms 103204 KB
test-1-10.txt AC 213 ms 103208 KB
test-1-11.txt AC 214 ms 103196 KB
test-1-12.txt AC 212 ms 103204 KB
test-1-13.txt AC 212 ms 103196 KB
test-1-14.txt AC 212 ms 103208 KB
test-1-15.txt AC 212 ms 103204 KB
test-2-01.txt AC 216 ms 103204 KB
test-2-02.txt AC 212 ms 103200 KB
test-2-03.txt AC 213 ms 103072 KB
test-2-04.txt AC 217 ms 103208 KB
test-2-05.txt AC 230 ms 103212 KB
test-2-06.txt AC 484 ms 103328 KB
test-2-07.txt AC 386 ms 103084 KB
test-2-08.txt AC 461 ms 103200 KB
test-2-09.txt AC 409 ms 103196 KB
test-2-10.txt AC 649 ms 103076 KB