Pagini recente » Cod sursa (job #145868) | Cod sursa (job #2516968) | Cod sursa (job #1916200) | Cod sursa (job #2406082) | Cod sursa (job #1735945)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int MAXN=1000+5;
int n, m, x1, y1, x2, y2, dim;
int a[MAXN][MAXN], b[MAXN][MAXN];
pair <int, int> dragoni[MAXN];
int dl[4] = {-1, 0, 1, 0};
int dc[4] = {0, 1, 0, -1};
inline bool isOK(int i, int j, int b[MAXN][MAXN])
{
if( b[i][j]!=-1 && b[i][j]!=-2 && i<=n && j<=n && i>=1 && j>=1) return true;
return false;
}
bool lee(int b[MAXN][MAXN])
{
queue < pair < int , int > > coada;
coada.push(make_pair(x1, y1));
while(!coada.empty())
{
int i = coada.front().first;
int j = coada.front().second;
coada.pop();
b[i][j] = -2;
for(int d=0; d<=3; d++)
{
int ii = i + dl[d];
int jj = j + dc[d];
if(isOK(ii, jj, b))
{
if(ii==x2 && jj==y2)
return true;
b[ii][jj] = -2;
coada.push(make_pair(ii, jj));
}
}
}
return false;
}
bool solve(int cat)
{
queue < pair < int , int > > ddd;
for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) b[i][j] = a[i][j];
for(int i=1; i<=dim; i++) ddd.push(make_pair(dragoni[i].first, dragoni[i].second));
ddd.push(make_pair(NULL, NULL));
while(!ddd.empty() && cat)
{
int i = ddd.front().first;
int j = ddd.front().second;
ddd.pop();
b[i][j] = -2;
if(i == NULL && j == NULL)
{
cat--;
if(cat)
{
ddd.push(make_pair(NULL, NULL));
}
else
{
return lee(b);
}
i = ddd.front().first;
j = ddd.front().second;
ddd.pop();
b[i][j] = -2;
}
for(int d=0; d<=3; d++)
{
int ii = i + dl[d];
int jj = j + dc[d];
if(ii<=n && jj<=n && ii>=1 && jj>=1)
{
if(b[ii][jj] != -2)
{
ddd.push(make_pair(ii,jj));
b[ii][jj] = -2;
}
}
}
}
return false;
}
int cb()
{
int st = 1, dr = 1000, m, last = -1;
while(st<=dr)
{
m = (st+dr) / 2;
if(solve(m))
{
last = m;
st = m + 1;
}
else
dr = m - 1;
}
return last;
}
int main()
{
fin>>n>>m;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
{
char c;
fin>>c;
if(c == 'I')
{
x1 = i, y1 = j;
}
else if(c == 'D')
{
dragoni[++dim] = make_pair(i,j);
}
else if(c == '*')
{
a[i][j] = -1;
}
else if(c == 'O')
{
x2 = i, y2 = j;
}
}
fout << cb() + 1;
}