Pagini recente » Cod sursa (job #1867322) | Cod sursa (job #2837748) | Cod sursa (job #578532) | Cod sursa (job #736874) | Cod sursa (job #2294214)
#include <iostream>
#include <fstream>
#include <cstring>
#include <queue>
using namespace std;
struct Punct
{
int x, y;
} S, C;
const int N = 2010;
bool **valid, **viz;
int **dist;
//bool valid[N][N], viz[N][N];
//int dist[N][N];
int m , n, dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
queue <Punct> q;
void Setare_viz()
{
int i, j;
for ( i = 0; i <= n ; i++)
for ( j = 0 ; j <= m ; j ++)
viz[i][j] = 0;
}
void verif ()
{
int i;
Punct aux,aux2;
while ( !q.empty() )
{
aux = q.front();
q.pop();
for (i = 0; i < 4; i++)
{
aux2.x = aux.x + dx[i];
aux2.y = aux.y + dy[i];
if(aux2.x && aux2.y && aux2.x <= n && aux2.y <= m)
if(viz[aux2.x][aux2.y] == false)
//if ( !viz[aux2.x][aux2.y] && aux2.x && aux2.y && aux2.x <= n && aux2.y <= m)
{
viz[aux2.x][aux2.y] = true;
dist[aux2.x][aux2.y] = dist[aux.x][aux.y]+1;
q.push(aux2);
}
}
}
}
bool Lee ( int p )
{
if(dist[S.x][S.y] < p)
return false;
Setare_viz();
viz[S.x][S.y] = 1;
q.push(S);
Punct aux, aux2;
int i;
while(!q.empty())
{
aux = q.front();
q.pop();
for ( i = 0; i < 4 ; i++)
{
aux2.x = aux.x + dx[i];
aux2.y = aux.y + dy[i];
if(aux2.x && aux2.y && aux2.x <= n && aux2.y <= m)
if(dist[aux2.x][aux2.y] >= p && viz[aux2.x][aux2.y] == false && valid[aux2.x][aux2.y] == false)
//if ( aux2.x && aux2.y && aux2.x <= n && aux2.y <= m && dist[aux2.x][aux2.y] >= p && !viz[aux2.x][aux2.y] && !valid[aux2.x][aux2.y])
{
viz[aux2.x][aux2.y] = 1;
q.push(aux2);
if( aux2.x == C.x && aux2.y == C.y )
{
while( !q.empty())
q.pop();
return true;
}
}
}
}
return false;
}
int cautare()
{
int st = 0, dr = N, m, sol = -1;
while(st <= dr)
{
m =(st + dr) / 2;
if( Lee( m ) )
{
sol = m;
st = m + 1;
}
else
dr = m - 1;
}
return sol;
}
int main()
{
ifstream in ("barbar.in");
ofstream out ("barbar.out");
char h[N];
int i ,j;
in >> n >> m;
dist = new int*[n+3];
viz = new bool*[n+3];
valid = new bool*[n+3];
for (i = 0 ; i <= n+1; i++)
{
dist[i] = new int[m+3];
valid[i]= new bool[m+3];
viz[i] = new bool[m+3];
}
for (i = 1 ; i <= n; i++)
{
in >> h;
for ( j = 1; j <= m ; j++)
{
if( h[j] == '*')
valid[i][j+1] = 1;
else
{
if(h[j] == 'I')
{
S.x = i;
S.y = j+1;
}
else
{
if ( h[j] == 'O')
{
C.x = i;
C.y = j+1;
}
else if(h[j] == 'D')
{
viz[i][j+1] = 1;
Punct xx;
xx.x = i;
xx.y = j+1;
q.push(xx);
}
}
}
}
}
verif();
int sol = cautare();
out << sol;
in.close();
out.close();
return 0;
}