| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 143315 | Sorting | 경찰관과 강도 (BOI14_coprobber) | C++14 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "coprobber.h"
#include <bits/stdc++.h>
pair<int, short> dp[MAX_N][MAX_N][2];
bool *a;
int n;
int solve(int cop, int robber, bool turn){
pair<int, short> &p = dp[cop][robber][turn];
if(cop == robber){
if(!turn){
return cop;
}
else{
return -1;
}
}
if(dp.second == 2){
return dp.first;
}
if(dp.second == 1){
if(!turn){
return -1;
}
else{
return robber;
}
}
dp.second = 1;
dp.first = -1;
if(!turn){
for(int i = 0; i < n; i++){
if(a[i][cop] || i == cop){
int curr = solve(i, robber, !turn);
if(curr == -1){
dp.first = i;
dp.second = 2;
return dp.first;
}
}
}
}
else{
for(int i = 0; i < n; i++){
if(a[i][robber]){
int curr = solve(cop, i, !turn);
if(curr == -1){
dp.first = i;
dp.second = 2;
return dp.first;
}
}
}
}
dp.second = 2;
return dp.first;
}
int cop;
int start(int N, bool A[MAX_N][MAX_N]){
a = A;
n = N;
for(int i = 0; i < n; ++i){
for(int j = 0; j < n; ++j){
solve(i, j, 0);
}
}
int sol = -1;
for(int i = 0; i < n; i++){
bool ok = true;
for(int j = 0; j < n; j++){
if(solve(i, j, 0) == -1){
ok = false;
return;
}
}
if(ok){
sol = i;
}
}
cop = sol;
return sol;
}
int nextMove(int R){
cop = dp[cop][R][0];
return cop;
}
