Cod sursa(job #1733703)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 25 iulie 2016 14:22:15
Problema Secventa Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.72 kb
#include <cstdio>
#include <algorithm>
#include <queue>
#define MAX 65536
#define x first
#define y second
#define MaxN 1005
using namespace std;

int pos=0,R,C,StartX,StartY,EndX,EndY,MinDist[MaxN][MaxN],MaxRoad[MaxN][MaxN];
char Ch=' ',v[MaxN][MaxN],f[MAX];
bool used[MaxN][MaxN];
queue <pair<int,int>> Q;
void r(int &nr)
{
    nr=0;
     while(f[pos]<'0'||f[pos]>'9')
     {
        pos++;
        if(pos==MAX)
            fread(f,1,MAX,stdin),pos=0;
     }
    while(f[pos]>='0'&&f[pos]<='9')
    {
        nr=nr*10+f[pos++]-'0';
        if(pos==MAX)
            fread(f,1,MAX,stdin),pos=0;
    }
}
void rch(char &ch)
{
	ch=f[pos++];
	if(pos==MAX)
		pos=0,fread(f,1,MAX,stdin);
}
int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
	fread(f,1,MAX,stdin);
	r(R);r(C);
	while(Ch!='\n')
		rch(Ch);
	for(int i=1;i<=R;i++)
	{
		for(int j=1;j<=C;j++)
		{
			rch(v[i][j]);
			if(v[i][j]=='I')
				StartX=i,StartY=j;
			if(v[i][j]=='O')
				EndX=i,EndY=j;
			if(v[i][j]=='D')
				Q.push(make_pair(i,j)),used[i][j]=true,MinDist[i][j]=0;
		}
		if(i<R)
		{
			Ch=' ';
			while(Ch!='\n')
				rch(Ch);
		}
	}
	while(!Q.empty())
	{
		if(Q.front().x+1<=R&&!used[Q.front().x+1][Q.front().y]&&v[Q.front().x+1][Q.front().y]!='*')
			Q.push(make_pair(Q.front().x+1,Q.front().y)),MinDist[Q.front().x+1][Q.front().y]=1+MinDist[Q.front().x][Q.front().y],used[Q.front().x+1][Q.front().y]=true;
		
		if(Q.front().x-1>0&&!used[Q.front().x-1][Q.front().y]&&v[Q.front().x-1][Q.front().y]!='*')
			Q.push(make_pair(Q.front().x-1,Q.front().y)),MinDist[Q.front().x-1][Q.front().y]=1+MinDist[Q.front().x][Q.front().y],used[Q.front().x-1][Q.front().y]=true;
		
		if(Q.front().y+1<=C&&!used[Q.front().x][Q.front().y+1]&&v[Q.front().x][Q.front().y+1]!='*')
			Q.push(make_pair(Q.front().x,Q.front().y+1)),MinDist[Q.front().x][Q.front().y+1]=1+MinDist[Q.front().x][Q.front().y],used[Q.front().x][Q.front().y+1]=true;
		
		if(Q.front().y-1>0&&!used[Q.front().x][Q.front().y-1]&&v[Q.front().x][Q.front().y-1]!='*')
			Q.push(make_pair(Q.front().x,Q.front().y-1)),MinDist[Q.front().x][Q.front().y-1]=1+MinDist[Q.front().x][Q.front().y],used[Q.front().x][Q.front().y-1]=true;
		Q.pop();
	}
	MaxRoad[EndX][EndY]=-1;
	Q.push(make_pair(StartX,StartY)),MaxRoad[StartX][StartY]=MinDist[StartX][StartY];
	while(!Q.empty())
	{
		if(Q.front().x+1<=R&&v[Q.front().x+1][Q.front().y]!='*'&&MaxRoad[Q.front().x+1][Q.front().y]<min(MinDist[Q.front().x+1][Q.front().y],MaxRoad[Q.front().x][Q.front().y]))
			Q.push(make_pair(Q.front().x+1,Q.front().y)),MaxRoad[Q.front().x+1][Q.front().y]=min(MinDist[Q.front().x+1][Q.front().y],MaxRoad[Q.front().x][Q.front().y]);

		if(Q.front().x-1>0&&v[Q.front().x-1][Q.front().y]!='*'&&MaxRoad[Q.front().x-1][Q.front().y]<min(MinDist[Q.front().x-1][Q.front().y],MaxRoad[Q.front().x][Q.front().y]))
			Q.push(make_pair(Q.front().x-1,Q.front().y)),MaxRoad[Q.front().x-1][Q.front().y]=min(MinDist[Q.front().x-1][Q.front().y],MaxRoad[Q.front().x][Q.front().y]);

		if(Q.front().y+1<=C&&v[Q.front().x][Q.front().y+1]!='*'&&MaxRoad[Q.front().x][Q.front().y+1]<min(MinDist[Q.front().x][Q.front().y+1],MaxRoad[Q.front().x][Q.front().y]))
			Q.push(make_pair(Q.front().x,Q.front().y+1)),MaxRoad[Q.front().x][Q.front().y+1]=min(MinDist[Q.front().x][Q.front().y+1],MaxRoad[Q.front().x][Q.front().y]);

		if(Q.front().y-1>0&&v[Q.front().x][Q.front().y-1]!='*'&&MaxRoad[Q.front().x][Q.front().y-1]<min(MinDist[Q.front().x][Q.front().y-1],MaxRoad[Q.front().x][Q.front().y]))
			Q.push(make_pair(Q.front().x,Q.front().y-1)),MaxRoad[Q.front().x][Q.front().y-1]=min(MinDist[Q.front().x][Q.front().y-1],MaxRoad[Q.front().x][Q.front().y]);
		Q.pop();
	}
	printf("%d",MaxRoad[EndX][EndY]);
	return 0;
}