Cod sursa(job #2391410)

Utilizator AndreiDeltaBalanici Andrei Daniel AndreiDelta Data 28 martie 2019 20:27:36
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <fstream>
#include <queue>
#include <bitset>
#include <cstdio>
#include <cstring>
#define NMAx 1024
#define ff first
#define ss second
#define mkp make_pair
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;

queue < pair<short,short> > Q;
pair <short,short> Start,Finish;
short N,M,Sol,A[NMAx][NMAx],Dx[]={1,-1,0,0},Dy[]={0,0,1,-1};
bitset <NMAx> viz[NMAx];
char S[NMAx];

bool Fill(int Val) {

	int k,X,Y,Xnou,Ynou;

	memset(viz,0,sizeof(viz));
	Q.push(Start);

	while(Q.size()) {

		X=Q.front().ff;
		Y=Q.front().ss;
		Q.pop();

		for(k=0;k<4;k++) {

			Xnou=X+Dx[k];
			Ynou=Y+Dy[k];

			if(!viz[Xnou][Ynou]&&A[Xnou][Ynou]>=Val) {
				viz[Xnou][Ynou]=1;
				Q.push(mkp(Xnou,Ynou));
				}

			}

		}

	if(viz[Finish.ff][Finish.ss])
		return 1;
	return 0;

}
int Search() {

	int Right,Step,i;

	Right=min(A[Start.ff][Start.ss],A[Finish.ff][Finish.ss]);

	for(Step=1;Step<Right;Step<<=1);

	for(i=0;Step;Step>>=1)
		if(Step+i<=Right&&Fill(i+Step))
			i+=Step;

	return i+Step;

}
void Lee() {

	int k,X,Y,Xnou,Ynou;

	while(Q.size()) {

		X=Q.front().ff;
		Y=Q.front().ss;
		Q.pop();

		for(k=0;k<4;k++) {

			Xnou=X+Dx[k];
			Ynou=Y+Dy[k];

			if(!A[Xnou][Ynou]) {
				A[Xnou][Ynou]=A[X][Y]+1;
				Q.push(mkp(Xnou,Ynou));
				}

			if(A[Xnou][Ynou]>A[X][Y]+1)
				A[Xnou][Ynou]=A[X][Y]+1;

			}
		}

}
void bordare() {

	for(int i=0;i<=M+1;i++)
		A[0][i]=A[N+1][i]=-1;

	for(int i=0;i<=N+1;i++)
		A[i][0]=A[i][M+1]=-1;

}
void citire() {

	int i,j;
	ifstream in("barbar.in");
	in>>N>>M;
	in.getline(S,3);

	for(i=1;i<=N;i++) {

		in.getline(S+1,NMAx);

		for(j=1;j<=M;j++)
			switch(S[j]) {
				case '.':break;
				case '*':A[i][j]=-1;break;
				case 'D':A[i][j]=1;Q.push(mkp(i,j));break;
				case 'I':Start=mkp(i,j);break;
				case 'O':Finish=mkp(i,j);break;
				}

		}

	in.close();

}
void afis() {

	ofstream out("barbar.out");

	out<<Sol<<'\n';

	out.close();

}
int main() {

	citire();
	bordare();

	Lee();
	Sol=Search()-1;

	afis();

	return 0;

}