Cod sursa(job #2657217)

Utilizator Teodora1314Teodora Oancea-Negoita Teodora1314 Data 10 octombrie 2020 09:34:17
Problema Barbar Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.74 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <cstring>
using namespace std;

queue<pair<int, int> > TEO;
int n, i, r, j, c, a[1005][1005], x1, x2, y11, y2,mx,rez;
int b[1005][1005];
char ca;
int linie, coloana, linienoua, coloananoua, k;
int dx[4] = { -1,  0, 1, 0 };
int dy[4] = { 0, -1, 0, 1 };

ifstream in ("barbar.in");
ofstream out ("barbar.out");

void afis()
{
	for (int i = 0; i <= r+1; ++i)
	{
		for (int j = 0; j <= c+1; ++j)
			out << a[i][j] << "     ";
		out << "\n";
	}
}

int drum (int x)
{
	memset(b, 0, sizeof(b));

	if(a[x1][y11] >= x)
		TEO.push(make_pair(x1, y11));

    while (TEO.empty() == 0)
	{
		linie = TEO.front().first;
		coloana = TEO.front().second;
		b[linie][coloana] = 1;

		for (k = 0; k < 4; k++)
		{
			linienoua = linie + dx[k];
			coloananoua = coloana + dy[k];
			if (a[linienoua][coloananoua] >= x && !b[linienoua][coloananoua])
			{
				TEO.push(make_pair(linienoua, coloananoua));
			}
		}
		TEO.pop();
	}

	return b[x2][y2];
}

int main()
{

	in >> r >> c;
	for (i = 1; i <= r; i++)
	{
		for (j = 1; j <= c; j++)
		{
			in >> ca;
			if (ca == '.')
				a[i][j] = 0;
			else if (ca == '*')
				a[i][j] = -2;
			else if (ca == 'D')
			{
				a[i][j] = 1;
				TEO.push(make_pair(i, j));
			}
			else if (ca == 'I')
			{
				x1 = i;
				y11 = j;

			}
			else if (ca == 'O')
			{
				x2 = i;
				y2 = j;
			}

		}
	}

	for (j = 1; j <= c + 1; j++)
	{
		a[0][j] = -2;
		a[r + 1][j] = -2;
	}
	for (i = 1; i <= r + 1; i++)
	{
		a[i][c + 1] = -2;
		a[i][0] = -2;

	}


	while (TEO.empty() == 0)
	{
		linie = TEO.front().first;
		coloana = TEO.front().second;
		for (k = 0; k < 4; k++)
		{
			linienoua = linie + dx[k];
			coloananoua = coloana + dy[k];
			if (linienoua > 0 && linienoua <= r && coloananoua > 0 && coloananoua <= c && a[linienoua][coloananoua] == 0)
			{
				a[linienoua][coloananoua] = a[linie][coloana] + 1;
				TEO.push(make_pair(linienoua, coloananoua));
			}
		}
		TEO.pop();
	}

	for (int i = 1; i <= r; ++i)
		for (int j = 1; j <= c; ++j)
			if (a[i][j] > 0)
				a[i][j] -= 1;
    for(int i=1;i<=r;i++)
    {
        for (int j=1;j<=c;j++)
        {
            if(a[i][j]>mx)
                mx=a[i][j];
        }
    }
    int st=1,dr=mx;
	rez = -1;
	//out << st << " " << dr<<"\n";
    while(st<=dr)
    {
        int mij=(st+dr)/2;
        if(drum(mij)!=0)
        {
            st=mij+1;
            rez=mij;
        }
        else
        {
            dr=mij-1;
        }
    }
    out<<rez<<"\n";

	//afis();

	/*out << a[x2][y2] << '\n';
	for (i = 1; i <= r; i++)
	{
		for (j = 1; j <= c; j++)
		{
			out << a[i][j] << ' ';
		}
		out << '\n';
	}*/
	return 0;
}