Cod sursa(job #2975081)

Utilizator alexdmnDamian Alexandru alexdmn Data 5 februarie 2023 12:53:32
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <fstream>
#include <queue>

using namespace std;
char v[1005][1005];
int f[1005][1005], d[1005][1005];
pair <int, int> p[5], c, st, fi;
queue <pair<int, int > > q;
void bfs()
{
	while(!q.empty())
	{
		for(int i=1;i<=4;i++)
		{
			c=q.front();
			c.first+=p[i].first;
      c.second+=p[i].second;
      if(d[c.first][c.second]==0 && v[c.first][c.second]!='*' && v[c.first][c.second]!='D')
			{
				d[c.first][c.second]=d[q.front().first][q.front().second]+1;
				q.push(c);
			}
		}
		q.pop();
	}
}
int drum(int mid)
{
	int ok=0;
  q.push(st);
  f[st.first][st.second]=1;
	while(!q.empty())
	{
		if(v[q.front().first][q.front().second]=='O')
			ok=1;
		for(int i=1;i<=4;i++)
		{
			c=q.front();
			c.first+=p[i].first;
      c.second+=p[i].second;
      if(d[c.first][c.second]>=mid && v[c.first][c.second]!='*' && f[c.first][c.second]==0)
			{
				f[c.first][c.second]=1;
				q.push(c);
			}
		}
		q.pop();
	}

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

    int n, m, s, d, mid, ok, sol=-1;
    cin>>n>>m;

    for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			{
        cin>>v[i][j];
        if(v[i][j]=='D')
				{
					q.push({i, j});
				}
				if(v[i][j]=='I')
					st={i, j};
				if(v[i][j]=='O')
					fi={i, j};
			}
		}

    p[1].first=1;
    p[2].second=1;
    p[3].first=-1;
    p[4].second=-1;
    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]='*';
    }

    bfs();

		s=1;
    d=n*m;
    while(s<=d)
		{
			mid=(s+d)/2;
			ok=drum(mid);
			for(int i=1;i<=n;i++)
			{
				for(int j=1;j<=m;j++)
				{
					f[i][j]=0;
				}
			}
			if(ok==1)
			{
				s=mid+1;
				sol=mid;
			}
			else
				d=mid-1;
		}
		cout<<sol;

    return 0;
}