Pagini recente » Cod sursa (job #1350307) | Cod sursa (job #2099254) | Cod sursa (job #2095497) | Cod sursa (job #677290) | Cod sursa (job #565433)
Cod sursa(job #565433)
#include <iostream>
#include <fstream>
#include <string>
#include <queue>
#include <vector>
using namespace std;
#define P push
#define F first
#define S second
#define PP pop
#define maxN 1005
#define INF (1 << 30)
#define maxDist (1 << 20)
queue < pair <int, int> > Q;
int a[maxN][maxN], cost[maxN][maxN];
int N, M, X, Y, X2, Y2;
int linie[] = {-1, 0, 1, 0};
int col[] = {0, -1, 0, 1};
bool cont[maxN][maxN];
int rsp;
int verif (int dist)
{
memset (cont, false, sizeof (cont));
for ( ; ! Q.empty (); )
Q.PP();
Q.P ( make_pair (X, Y) );
cont[X][Y] = true;
for ( ; ! Q.empty (); )
{
int x = Q.front().F;
int y = Q.front().S;
Q.PP();
for (int t = 0; t < 4; ++ t)
{
int x1 = x + linie[t];
int y1 = y + col[t];
if (x1 > N || x1 < 1)
continue;
if (y1 > M || y1 < 1)
continue;
if (cont[x1][y1])
continue;
if (cost[x1][y1] < dist)
continue;
cont[x1][y1] = true;
if (x1 == X2 && y1 == Y2)
return 1;
Q.P ( make_pair (x1, y1) );
}
}
return 0;
}
int bin_Search()
{
int st = 0, dr = maxDist, mid;
while (st <= dr)
{
mid = (st + dr) / 2;
if (verif (mid))
{
rsp = max (rsp, mid);
st = mid + 1;
}
else
dr = mid - 1;
}
mid = (st + dr) / 2;
if ( ! verif (mid) )
return 0;
return 1;
}
int main()
{
ifstream f("barbar.in");
ofstream g("barbar.out");
f >> N >> M;
for (int i = 1; i <= N; ++ i)
for (int j = 1; j <= M; ++ j)
{
char c;
f >> c;
if (c == '.')
{
a[i][j] = 0;
cost[i][j] = INF;
continue;
}
if (c == '*')
{
a[i][j] = 1;
continue;
}
if (c == 'D')
{
a[i][j] = 2;
Q.P( make_pair (i, j) );
cont[i][j] = true;
continue;
}
if (c == 'I')
{
a[i][j] = 5;
X = i;
Y = j;
continue;
}
if (c == 'O')
{
a[i][j] = 6;
X2 = i;
Y2 = j;
}
}
for ( ; ! Q.empty() ; )
{
int x = Q.front().F;
int y = Q.front().S;
Q.PP();
for (int t = 0; t < 4; ++ t)
{
int x1 = x + linie[t];
int y1 = y + col[t];
if (x1 > N || x1 < 1)
continue;
if (y1 > M || y1 < 1)
continue;
if (cont[x1][y1])
continue;
cost[x1][y1] = cost[x][y] + 1;
cont[x1][y1] = true;
Q.P ( make_pair (x1, y1) );
}
}
if ( ! bin_Search() )
g << - 1;
else
g << rsp;
f.close();
g.close();
return 0;
}