제출 #482570

#제출 시각아이디문제언어결과실행 시간메모리
482570BackNoobMecho (IOI09_mecho)C++14
14 / 100
337 ms9184 KiB
#include <bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define endl '\n'
#define mask(i) (1LL << (i))
#define ull unsigned long long
#define ld long double
using namespace std;
const int mxN = 1007;
const ll inf = 1e9 + 277;
const int mod = 1e9 + 7;
const ll infll = 1e18 + 7;
const int base = 307;
const int LOG = 20;
 
template <typename T1, typename T2> bool minimize(T1 &a, T2 b) {
	if (a > b) {a = b; return true;} return false;
}
template <typename T1, typename T2> bool maximize(T1 &a, T2 b) {
	if (a < b) {a = b; return true;} return false;
}

int n , limit;
char a[mxN][mxN];
int bee[mxN][mxN];
int dist[mxN][mxN];
pair<int , int> mecho , home;
int dx[4] = {0 , 1 , 0 , -1};
int dy[4] = {1 , 0 , -1 , 0};

bool ok(int x)
{
	for(int i = 0 ; i <= n ; i++)
	for(int j = 0 ; j <= n ; j++) dist[i][j] = inf;
	queue<pair<int , int>> q;
	q.push(mecho);
	dist[mecho.fi][mecho.se] = limit * x;

	while(!q.empty()) {
		int x = q.front().fi;
		int y = q.front().se;
		q.pop();

		for(int d = 0 ; d < 4 ; d++) {
			int newx = x + dx[d];
			int newy = y + dy[d];
			if(1 <= newx && newx <= n && 1 <= newy && newy <= n && a[newx][newy] == 'G') {
				if(dist[newx][newy] > dist[x][y] + 1 && bee[newx][newy] > (dist[x][y] + 1) / limit) {
					dist[newx][newy] = dist[x][y] + 1;
					q.push({newx , newy});
				}
			}
		}
	}

	if(dist[home.fi][home.se] != dist[0][0]) return true;
	return false;
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    //freopen("task.inp" , "r" , stdin);
    //freopen("task.out" , "w" , stdout);
    
    cin >> n >> limit;
    for(int i = 1 ; i <= n ; i++)
    for(int j = 1 ; j <= n ; j++) cin >> a[i][j];

    memset(bee, 0x3f, sizeof bee);
    queue<pair<int , int>> q;
    for(int i = 1 ; i <= n ; i++)
    for(int j = 1 ; j <= n ; j++) {
    	if(a[i][j] == 'H') {
    		bee[i][j] = 0;
    		q.push({i , j});
    	}
    	if(a[i][j] == 'M') mecho = {i , j};
    	if(a[i][j] == 'D') home = {i , j};
    }

    a[home.fi][home.se] = 'G';

    while(!q.empty()) {
    	int x = q.front().fi;
    	int y = q.front().se;
    	q.pop();

    	for(int d = 0 ; d < 4 ; d++) {
    		int newx = x + dx[d];
    		int newy = y + dy[d];
    		if(1 <= newx && newx <= n && 1 <= newy && newy <= n && a[newx][newy] == 'G') {
    			if(bee[newx][newy] > bee[x][y] + 1) {
    				bee[newx][newy] = bee[x][y] + 1;
    				q.push({newx , newy});
    			}
    		}
    	}
    }

    int lo = 0 , hi = inf;
    while(lo + 1 < hi) {
    	int mid = (lo + hi) / 2;
    	if(ok(mid)) lo = mid;
    	else hi = mid;
    }

    if(ok(lo) == false) cout << -1;
    else cout << lo;

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...