제출 #309734

#제출 시각아이디문제언어결과실행 시간메모리
309734nicolaalexandra경찰관과 강도 (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...