Cod sursa(job #2644567)

Utilizator game_difficultyCalin Crangus game_difficulty Data 24 august 2020 22:20:17
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2 kb
#include <bits/stdc++.h>
#define int int64_t
#define x first
#define y second
using namespace std;

using i64 = long long;
using f64 = double;
using f80 = long double;
using pii = pair<int, int>;
using ptx = pair<f64, f64>;

int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
int v[1005][1005];
int r,c;
pii st,ex;

void border() {
    for(int i=0;i<=r+1;i++){
	v[i][0]=-1;
	v[i][c+1]=-1;
    }
    for(int i=0;i<=c+1;i++){
	v[0][i]=-1;
	v[r+1][i]=-1;
    }
}

bool cango(int n) {
    queue<pii> q;
    bitset<1000001> been;
    q.push(st);
    been[(st.x-1)*c+st.y]=1;
    while(!q.empty()) {
	pii now=q.front();
	if(now.x==ex.x && now.y==ex.y)
	    return 1;
	for(int i=0;i<4;i++) {
	    if(v[now.x+dx[i]][now.y+dy[i]]!=-1 && v[now.x+dx[i]][now.y+dy[i]]>=n && been[(now.x+dx[i]-1)*c+now.y+dy[i]]==0){
		q.emplace(now.x+dx[i],now.y+dy[i]);
		been[(now.x+dx[i]-1)*c+now.y+dy[i]]=1;
	    }
	}
	q.pop();
    }
    return 0;
}

int32_t main() {
#ifdef HOME
    freopen("dat.in", "r", stdin);
    freopen("dat.out", "w", stdout);
#else
    freopen("barbar.in", "r", stdin);
    freopen("barbar.out", "w", stdout);
#endif
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    cin>>r>>c;
    border();
    char ch;
    queue<pii> q;
    for(int i=1;i<=r;i++) {
	for(int j=1;j<=c;j++) {
	    cin>>ch;
	    switch(ch) {
		case 'I':
		    st={i,j};
		    break;
		case 'D':
		    q.emplace(i,j);
		    v[i][j]=-1;
		    break;
		case '*':
		    v[i][j]=-1;
		    break;
		case 'O':
		    ex={i,j};
		    break;
	    }
	}
    }
    while(!q.empty()) {
	pii now=q.front();
	int nowVal=(v[now.x][now.y]==-1) ? 0 : v[now.x][now.y];
	for(int i=0;i<4;i++) {
	    if(v[now.x+dx[i]][now.y+dy[i]]!=-1 && (v[now.x+dx[i]][now.y+dy[i]]>nowVal+1 || v[now.x+dx[i]][now.y+dy[i]]==0)) {
		v[now.x+dx[i]][now.y+dy[i]]=nowVal+1;
		q.emplace(now.x+dx[i],now.y+dy[i]);
	    }
	}
	q.pop();
    }
    int pas,pos=0;
    for(pas=1<<10;pas>0;pas/=2) {
	if(cango(pas+pos)) {
	    pos+=pas;
	}
    }
    if(pos==0)
	cout<<-1;
    else
	cout<<pos;
    return 0;
}