Cod sursa(job #2241879)

Utilizator alex2209alexPavel Alexandru alex2209alex Data 17 septembrie 2018 11:28:57
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <fstream>
#include <queue>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
pair<int,int>x;
pair<pair<int,int>,int>x2;
queue<pair<pair<int,int>,int> >dq;
int n,m,i,j,a,b,cost,ls,cs,l[1000001],c[1000001],v2[1001][1001],v3[1001][1001],v[1001][1001],nr;
int main(int argc, char *argv[]) {
	f>>n>>m;
	for(i=1;i<=n;i++) {
		for(j=1;j<=m;j++) {
			f>>a;
			v2[i][j]=n*m+1;
			v3[i][j]=-1;
			if(a=='D') {
				nr++;
				l[nr]=i;
				c[nr]=j;
			}
			else if(a=='I') {
				ls=i;
				cs=j;
				v[i][j]=-2;
			}
			else if(a=='*') {
				v[i][j]=-1;
			}
		}
	}
	for(i=1;i<=nr;i++) {
		x=make_pair(l[i],c[i]);
		x2=make_pair(x,0);
		dq.push(x2);
	}
	while(!dq.empty()) {
		a=dq.front().first.first;
		b=dq.front().first.second;
		cost=dq.front().second;
		if(cost<v2[a][b]) {
			v2[a][b]=cost;
			if(a>1) {
				x=make_pair(a-1,b);
				x2=make_pair(x,cost+1);
				dq.push(x2);
			}
			if(b>1) {
				x=make_pair(a,b-1);
				x2=make_pair(x,cost+1);
				dq.push(x2);
			}
			if(a<n) {
				x=make_pair(a+1,b);
				x2=make_pair(x,cost+1);
				dq.push(x2);
			}
			if(b<m) {
				x=make_pair(a,b+1);
				x2=make_pair(x,cost+1);
				dq.push(x2);
			}
		}
		dq.pop();
	}
	x=make_pair(ls,cs);
	x2=make_pair(x,v2[ls][cs]);
	dq.push(x2);
	while(!dq.empty()) {
		a=dq.front().first.first;
		b=dq.front().first.second;
		cost=dq.front().second;
		cost=min(cost,v2[a][b]);
		if(cost>v3[a][b]) {
			v3[a][b]=cost;
			if(a>1 && v[a-1][b]==0) {
				x=make_pair(a-1,b);
				x2=make_pair(x,cost);
				dq.push(x2);
			}
			if(b>1 && v[a-1][b]==0) {
				x=make_pair(a,b-1);
				x2=make_pair(x,cost);
				dq.push(x2);
			}
			if(a<n && v[a-1][b]==0) {
				x=make_pair(a+1,b);
				x2=make_pair(x,cost);
				dq.push(x2);
			}
			if(b<m && v[a-1][b]==0) {
				x=make_pair(a,b+1);
				x2=make_pair(x,cost);
				dq.push(x2);
			}
		}
		dq.pop();
	}
	g<<v3[a][b];
}