Cod sursa(job #2795500)

Utilizator alexdmnDamian Alexandru alexdmn Data 6 noiembrie 2021 15:00:41
Problema Barbar Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.9 kb
#include <fstream>

using namespace std;
char v[1005][1005];
struct dragoni
{
	int l,c;
}d[1000005];
int viz[1005][1005],ok=0,o=0,h=0,s;
int dfs(int dist, int x, int y, int a, int b)
{
	viz[x][y]=1;
	if(x==a && y==b)
		ok=1;
	if(ok==0)
	{
		o=0;
        for(int i=0;i<h;i++)
		{
			s=0;
			if(x+1>d[i].l)
				s+=x+1-d[i].l;
			else
				s+=d[i].l-x-1;
			if(y>d[i].c)
				s+=y-d[i].c;
			else
				s+=d[i].c-y;
			if(s<dist)
			{
				o=1;
				break;
			}
		}
		if(v[x+1][y]=='O' && o==0 && viz[x+1][y]==0)
			dfs(dist, x+1, y, a, b);
		else if(v[x+1][y]=='.' && o==0 && viz[x+1][y]==0)
		{
			dfs(dist, x+1, y, a, b);
		}

		o=0;
		for(int i=0;i<h;i++)
		{
			s=0;
			if(x-1>d[i].l)
				s+=x-1-d[i].l;
			else
				s+=d[i].l-x+1;
			if(y>d[i].c)
				s+=y-d[i].c;
			else
				s+=d[i].c-y;
			if(s<dist)
			{
				o=1;
				break;
			}
		}
		if(v[x-1][y]=='O' && o==0 && viz[x-1][y]==0)
			dfs(dist, x-1, y, a, b);
		else if(v[x-1][y]=='.' && o==0 && viz[x-1][y]==0)
		{
			dfs(dist, x-1, y, a, b);
		}

		o=0;
		for(int i=0;i<h;i++)
		{
			s=0;
			if(x>d[i].l)
				s+=x-d[i].l;
			else
				s+=d[i].l-x;
			if(y+1>d[i].c)
				s+=y+1-d[i].c;
			else
				s+=d[i].c-y-1;
			if(s<dist)
			{
				o=1;
				break;
			}
		}
		if(v[x][y+1]=='O' && o==0 && viz[x][y+1]==0)
			dfs(dist, x, y+1, a, b);
		else if(v[x][y+1]=='.' && o==0 && viz[x][y+1]==0)
		{
			dfs(dist, x, y+1, a, b);
		}

		o=0;
		for(int i=0;i<h;i++)
		{
			s=0;
			if(x>d[i].l)
				s+=x-d[i].l;
			else
				s+=d[i].l-x;
			if(y-1>d[i].c)
				s+=y-1-d[i].c;
			else
				s+=d[i].c-y+1;
			if(s<dist)
			{
				o=1;
				break;
			}
		}
		if(v[x][y-1]=='O' && o==0 && viz[x][y-1]==0)
			dfs(dist, x, y-1, a, b);
		else if(v[x][y-1]=='.' && o==0 && viz[x][y-1]==0)
		{
			dfs(dist, x, y-1, a, b);
		}

	}
	return 0;
}
int main()
{
	ifstream cin("barbar.in");
	ofstream cout("barbar.out");

    int n,m,st=1,dr,mid,maxx=-1,x,y,a,b;
    cin>>n>>m;
    dr=n+m;

    for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cin>>v[i][j];
			if(v[i][j]=='I')
			{
				x=i;
				y=j;
			}
			else if(v[i][j]=='O')
			{
				a=i;
				b=j;
			}
			else if(v[i][j]=='D')
			{
				d[h].l=i;
				d[h].c=j;
				h++;
			}
		}

	}

	for(int i=0;i<=n+1;i++)
	{
		v[i][0]=v[i][m+1]='*';
	}
	for(int i=0;i<=m+1;i++)
	{
		v[0][i]=v[n+1][i]=1;
	}

	while(st<=dr)
	{
		mid=(dr-st)/2+st;
		ok=0;
		o=0;
        for(int i=0;i<h;i++)
		{
			s=0;
			if(x>d[i].l)
				s+=x-d[i].l;
			else
				s+=d[i].l-x;
			if(y>d[i].c)
				s+=y-d[i].c;
			else
				s+=d[i].c-y;
			if(s<mid)
			{
				o=1;
				break;
			}
		}
		if(o==0)
		{
			dfs(mid, x, y, a, b);
			for(int i=1;i<=n;i++)
			{
				for(int j=1;j<=m;j++)
				{
					viz[i][j]=0;
				}
			}
		}
		if(ok==1)
		{
			maxx=mid;
			st=mid+1;
		}
		else
			dr=mid-1;
	}

	cout<<maxx;

    return 0;
}