Submission #2198324


Source Code Expand

#include"bits/stdc++.h"
using namespace std;

const long long MOD = (long long)1e9 + 7;

vector<int> sq(26, -1);
vector<int> sq2bit(25);

bool isOK(int board, int sq) {
    //小さい順に見ているという前提のもとでboard状態のときにiに置けるかどうか

    //置かれている
    if (board & sq2bit[sq]) {
        return false;
    }

    if (5 <= sq && sq < 20) {
        //上下端の行ではない場合,上下の片方にだけ置かれているとダメ
        bool up = board & sq2bit[sq - 5];
        bool down = board & sq2bit[sq + 5];
        if ((up && !down) || (!up && down)) {
            return false;
        }
    }

    if ((sq % 5 != 0) && (sq % 5 != 4)) {
        //左右端の列ではない場合,左右の片方にだけ置かれているとダメ
        bool left = board & sq2bit[sq - 1];
        bool right = board & sq2bit[sq + 1];
        if ((left && !right) || (!left && right)) {
            return false;
        }
    }

    return true;
}

vector<int> memo(1 << 25, -1);

int solve(int board, int num) {
    //boardが盤面の状態, numが今見ている数字
    if (memo[board] != -1) {
        return memo[board];
    }

    if (num == 26) {
        return 1;
    }

    //位置が指定されているか
    if (sq[num] != -1) {
        return memo[board] = (isOK(board, sq[num]) ? solve(board | sq2bit[sq[num]], num + 1) : 0);
    }

    //指定されていない
    int ok_num = 0;
    for (int sq = 0; sq < 25; sq++) {
        if (isOK(board, sq)) {
            ok_num += solve(board | sq2bit[sq], num + 1);
            ok_num %= MOD;
        }
    }
    return memo[board] = ok_num;
}

int main() {
    for (int i = 0; i < 25; i++) {
        int x;
        cin >> x;
        sq[x] = i;
    }

    for (int i = 0; i < 25; i++) {
        sq2bit[i] = (1 << i);
    }

    cout << solve(0, 1) << endl;
}

Submission Info

Submission Time
Task D - 25個の整数
User tokumini
Language C++14 (GCC 5.4.1)
Score 100
Code Size 1957 Byte
Status AC
Exec Time 366 ms
Memory 131328 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 39 ms 131328 KB
sample-02.txt AC 153 ms 131328 KB
sample-03.txt AC 39 ms 131328 KB
sample-04.txt AC 39 ms 131328 KB
test-1-01.txt AC 39 ms 131328 KB
test-1-02.txt AC 39 ms 131328 KB
test-1-03.txt AC 40 ms 131328 KB
test-1-04.txt AC 40 ms 131328 KB
test-1-05.txt AC 39 ms 131328 KB
test-1-06.txt AC 40 ms 131328 KB
test-1-07.txt AC 39 ms 131328 KB
test-1-08.txt AC 40 ms 131328 KB
test-1-09.txt AC 39 ms 131328 KB
test-1-10.txt AC 40 ms 131328 KB
test-1-11.txt AC 39 ms 131328 KB
test-1-12.txt AC 40 ms 131328 KB
test-1-13.txt AC 39 ms 131328 KB
test-1-14.txt AC 40 ms 131328 KB
test-1-15.txt AC 40 ms 131328 KB
test-2-01.txt AC 49 ms 131328 KB
test-2-02.txt AC 71 ms 131328 KB
test-2-03.txt AC 40 ms 131328 KB
test-2-04.txt AC 46 ms 131328 KB
test-2-05.txt AC 133 ms 131328 KB
test-2-06.txt AC 366 ms 131328 KB
test-2-07.txt AC 124 ms 131328 KB
test-2-08.txt AC 224 ms 131328 KB
test-2-09.txt AC 353 ms 131328 KB
test-2-10.txt AC 329 ms 131328 KB