제출 #309734

#제출 시각아이디문제언어결과실행 시간메모리
309734nicolaalexandraCop and Robber (BOI14_coprobber)C++14
16 / 100
856 ms5112 KiB
#include <bits/stdc++.h>
#include "coprobber.h"
#define DIM 510
using namespace std;

int C,R;
struct stare{
    int c,r,t;
};
deque <stare> d;
int dp[DIM][DIM][2],fth[DIM][DIM];

int start (int n, bool a[MAX_N][MAX_N]){
    /// stari de pierdere / de castig
    /// C,R,0/1 - unde se afla politistu si hotu si cine a facut ultima miscare
    /// C,C,0/1 - stare de castig

    for (int i=0;i<n;i++){
        dp[i][i][0] = dp[i][i][1] = 1;
        d.push_back({i,i,0});
        d.push_back({i,i,1});
    }

    while (!d.empty()){
        int c = d.front().c, r = d.front().r, t = d.front().t;
        d.pop_front();

        if (!t){ /// trb sa mute hotu
            for (int i=0;i<n;i++){
                if (i == r || !a[r][i] || dp[c][i][1])
                    continue;

                /// daca toti vecinii lui i au stare de castig atunci si asta e stare de castig
                int ok = 1;
                for (int j=0;j<n;j++)
                    if (a[i][j] && !dp[c][j][0]){
                        ok = 0;
                        break;
                    }

                if (ok){
                    dp[c][i][1] = 1;
                    d.push_back({c,i,1});
                }}

        } else { /// politistul se muta sau sta pe loc
            for (int i=0;i<n;i++){
                if ((!a[c][i] && i != c) || dp[i][r][0])
                    continue;

                int ok = 0;
                for (int j=0;j<n;j++)
                    if (a[i][j] && dp[j][r][1])
                        ok = 1;
                if (ok){
                    dp[i][r][0] = 1;
                    fth[i][r] = c; /// unde ma duc din starea asta
                    d.push_back({i,r,0});
                }}}}

    for (int i=0;i<n;i++){
        int ok = 1;
        for (int j=0;j<n;j++)
            if (!dp[i][j][0]){
                ok = 0;
                break;
            }
        if (ok)
            return i;
    }
    return -1;

}

int nextMove (int R){

    C = fth[C][R];
    return C;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...