Cod sursa(job #2317143)

Utilizator AlexPascu007Pascu Ionut Alexandru AlexPascu007 Data 12 ianuarie 2019 21:13:04
Problema Barbar Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.19 kb
#include <fstream>
#include <cstring>
#define DIM 1010
#include <queue>
#define x first
#define y second
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int r,c,i,j,a[DIM][DIM],istart,jstart,istop,jstop,iv,jv,k,st,dr,mid,d[DIM][DIM],ok,p,u;
int di[]={-1,1,0,0};
int dj[]={0,0,-1,1};
pair<int,int> v[DIM];
queue< pair<int,int> > q;
char ch[DIM][DIM];
int main() {
	fin>>r>>c;
	for (i=1;i<=r;i++) {
        for (j=1;j<=c;j++) {
            fin>>ch[i][j];
            if (ch[i][j] == 'I') {
                istart = i;
                jstart = j;
                ch[i][j] = '.';
            }
            if (ch[i][j] == 'O') {
                istop = i;
                jstop = j;
                ch[i][j] = '.';
            }
            if (ch[i][j] == 'D') {
                u++;
                v[u].x = i;
                v[u].y = j;
                a[i][j] = 1;
                ch[i][j] = '.';
            }
        }
    }

    p = 1;
    while (p <= u) {
        for (int dir = 0; dir<=3; dir++) {
            iv = v[p].x + di[dir];
            jv = v[p].y + dj[dir];
            if (iv >= 1 && iv <= r & jv >= 1 && jv <= c && ch[iv][jv] == '.' && a[iv][jv] == 0) {
                u++;
                v[u].x = iv;
                v[u].y = jv;
                a[iv][jv] = 1 + a[ v[p].x ][ v[p].y ];
            }
        }
        p++;
    }
	st=1, dr=a[v[u].x][v[u].y];
	while (st<=dr) { //caut binar numai celule cu distanta pana la dragoni >=mid, de la istart,jstart la istop,jstop
		mid=(st+dr)/2;
		if (a[istart][jstart]<mid)
			ok=0;
		else {
			p=u=1;
			/*for (i=1;i<=r;i++)
				for (j=1;j<=c;j++)
					d[i][j]=0;*/
			memset(d,0,sizeof(d));
			d[istart][jstart]=1;
			v[1].x=istart; v[1].y=jstart;
			while (p<=u) {
				i=v[p].x; j=v[p].y;
				for (int dir=0;dir<4;dir++) {
					iv=i+di[dir];
					jv=j+dj[dir];
					if (iv>=1&&iv<=r&&jv>=1&&jv<=c&&a[iv][jv]>=mid&&d[iv][jv]==0) {
						u++;
						v[u].x=iv; v[u].y=jv;
						d[iv][jv]=1;
						if (iv==istop&&jv==jstop) {
							ok=1; break;
						}
					}
				}
				p++;
			}
		}
		if (ok==1)
			st=mid+1;
		else
			dr=mid-1;
	}
	fout<<dr-2;
	return 0;
}