Pagini recente » Cod sursa (job #409740) | Rating Samoilescu Sebastian (samoilescusebastian) | Cod sursa (job #2035933) | Cod sursa (job #2225845) | Cod sursa (job #1258192)
#include <fstream>
#include <bitset>
#include <queue>
#define Nmax 1010
#define x first
#define y second
using namespace std;
ifstream fin ("barbar.in");
ofstream fout ("barbar.out");
const int dl[] = { -1, 0, 1, 0 };
const int dc[] = { 0, 1, 0, -1 };
int N, M, sol = -1, V[Nmax][Nmax];
char C[Nmax][Nmax];
pair < int, int > start, stop, aux;
queue < pair < int, int > > Q;
bitset < Nmax > fr[Nmax];
bool Verif(int Min)
{
queue < pair < int, int > > q;
Q = q;
if (V[start.x][start.y] < Min) return false;
if (V[stop.x][stop.y] < Min) return false;
for (int i=1; i<=N; i++) fr[i].reset();
fr[start.x][start.y] = 1;
Q.push(start);
while (!Q.empty())
{
aux = Q.front();
Q.pop();
if (aux.x == stop.x && aux.y == stop.y) return true;
for (int k=0; k<=3; k++)
{
int i = aux.x + dl[k];
int j = aux.y + dc[k];
if (!fr[i][j] && C[i][j] == '.' && V[i][j] >= Min)
{
Q.push(make_pair(i, j));
fr[i][j] = 1;
}
}
}
return false;
}
void Caut_Binar()
{
int st = 0, dr = N*M, mij;
while (st <= dr)
{
mij = (st + dr) / 2;
if (Verif(mij))
{
sol = mij;
st = mij + 1;
}
else
{
dr = mij - 1;
}
}
}
void Lee()
{
while (!Q.empty())
{
aux = Q.front();
fr[aux.x][aux.y] = 1;
Q.pop();
for (int k=0; k<=3; k++)
{
int i = aux.x + dl[k];
int j = aux.y + dc[k];
if (!fr[i][j] && C[i][j] == '.')
{
V[i][j] = V[aux.x][aux.y] + 1;
Q.push(make_pair(i, j));
fr[i][j] = 1;
}
}
}
}
void Read_Data()
{
fin >> N >> M;
for (int i=1; i<=N; i++)
{
fin >> (C[i] + 1);
for (int j=1; j<=M; j++)
{
switch (C[i][j])
{
case 'I' :
{
start = make_pair(i, j);
C[i][j] = '.';
break;
}
case 'O' :
{
stop = make_pair(i, j);
C[i][j] = '.';
break;
}
case 'D' :
{
Q.push(make_pair(i, j));
V[i][j] = 0;
break;
}
}
}
}
}
int main()
{
Read_Data();
Lee();
Caut_Binar();
fout << sol << '\n';
fout.close();
return 0;
}