Pagini recente » Cod sursa (job #3278551) | Cod sursa (job #3220999) | Cod sursa (job #1541800) | Borderou de evaluare (job #1792893) | Cod sursa (job #560573)
Cod sursa(job #560573)
#include<fstream>
#include<string>
#include<queue>
using namespace std;
ofstream fout("barbar.out");
#define mp make_pair
#define f first
#define s second
void Read();
void Lee_dragon();
void Cauta(int st, int dr);
bool Lee(int);
void init();
int a[1002][1002];
int b[1002][1002];
char aux[1002];
queue<pair< pair<int, int>, int > > Q;
queue<pair<int, int> >Q1, Q2;
int n, m, mij1;
int ip, jp, is, js;
const int di[] = {1, 0, -1, 0},
dj[] = {0, -1, 0, 1};
int main()
{
Read();
Lee_dragon();
while(!Q2.empty() )
{
a[ Q2.front().f][Q2.front().s] = 0;
Q2.pop();
}
Cauta(0, 1010025);
return 0;
}
void Read()
{
ifstream fin("barbar.in");
fin >> n >> m;
fin.get();
for(int i = 1; i <= n; ++i)
{
fin >> aux;
for(int j = 0; j < m; ++j)
{
if( aux[j] == 'D')
Q.push(mp(mp(i, j+1), 0) ), Q2.push(mp(i, j+1));
if( aux[j] == '*')
a[i][j+1] = -1;
if( aux[j] == 'I')
ip = i, jp = j+1;
if( aux[j] == 'O')
is = i, js = j+1;
}
fin.get();
}
}
void Lee_dragon()
{
while( !Q.empty() )
{
int i = Q.front().f.f;
int j = Q.front().f.s;
int d = Q.front().s;
Q.pop();
for(int k = 0; k < 4; ++k)
{
int l = i + di[k];
int c = j + dj[k];
if( l >= 1 && l <= n && c >= 1 && c <= m && !a[l][c] )
{
a[l][c] = d + 1;
Q.push(mp(mp(l, c), d+1 ) );
}
}
}
}
void Cauta(int st, int dr)
{
int mij = (st + dr) /2;
init();
if( st + 1 < dr )
{
if( !Lee(mij) )
Cauta(st, mij);
else
{
mij1 = mij;
Cauta(mij, dr);
}
}
else
if( st == dr)
{
fout << dr;
exit(0);
}
else
if( st + 1 == dr)
{
if( Lee(dr) )
fout << dr;
else
{
init();
if(Lee(st) )
fout << st;
}
exit(0);
}
else
if( st > dr)
{
fout << -1;
exit(0);
}
}
void init()
{
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
if( a[i][j] != -1)
b[i][j] = 0;
else
b[i][j] = a[i][j];
}
bool Lee(int x)
{
Q1.push( mp(ip, jp) );
while( !Q1.empty() )
{
int i = Q1.front().f;
int j = Q1.front().s;
Q1.pop();
for(int k = 0; k < 4; ++k)
{
int l = i + di[k];
int c = j + dj[k];
if( l >= 1 && l <= n && c >= 1 && c <= m && a[l][c] >= x && !b[l][c] && a[l][c] != -1 )
{
if( l == is && c == js)
{
while( !Q1.empty() )
Q1.pop();
return 1;
}
b[l][c] = 3;
Q1.push( mp(l, c) );
}
}
}
return 0;
}