Submission #398836

#TimeUsernameProblemLanguageResultExecution timeMemory
398836faresbasbsCop and Robber (BOI14_coprobber)C++14
100 / 100
678 ms7544 KiB
#include <bits/stdc++.h>
#include "coprobber.h"
using namespace std;

struct node{
	int cop,rob,tag;
};

int n,curr,moves[501][501],win[501][501][2];
queue<node> q;

int start(int N , bool grid[MAX_N][MAX_N]){
	n = N;
	for(int i = 0 ; i < n ; i += 1){
		int cnt = 0;
		for(int j = 0 ; j < n ; j += 1){
			cnt += grid[i][j];
		}
		for(int j = 0 ; j < n ; j += 1){
			if(j != i){
				win[j][i][0] = 1 , win[j][i][1] = cnt;
			}
		}
	}
	for(int i = 0 ; i < n ; i += 1){
		q.push({i,i,0}),q.push({i,i,1});
	}
	while(q.size()){
		node nxt = q.front();
		q.pop();
		if(nxt.tag == 0){
			for(int i = 0 ; i < n ; i += 1){
				if(grid[nxt.rob][i] && win[nxt.cop][i][1]){
					win[nxt.cop][i][1] -= 1;
					if(!win[nxt.cop][i][1]){
						q.push({nxt.cop,i,1});
					}
				}
			}
		}else{
			for(int i = 0 ; i < n ; i += 1){
				if(win[i][nxt.rob][0] && (i == nxt.cop || grid[nxt.cop][i])){
					win[i][nxt.rob][0] -= 1;
					q.push({i,nxt.rob,0});
					moves[i][nxt.rob] = nxt.cop;
				}
			}
		}
	}
	for(int i = 0 ; i < n ; i += 1){
		if(win[0][i][0]){
			return -1;
		}
	}
	return 0;
}

int nextMove(int r){
	return curr = moves[curr][r];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...