Pagini recente » Cod sursa (job #1699626) | Cod sursa (job #3041621) | Cod sursa (job #403386) | Cod sursa (job #2880216) | Cod sursa (job #1090624)
#include <iostream>
#include<queue>
#include<cmath>
#include<algorithm>
#include<fstream>
#define maxn 1001
using namespace std;
int r,c,d_max=0;
char m[maxn][maxn];
int d[maxn][maxn];
int viz[maxn][maxn];
pair <int , int > start;
pair <int, int > finish;
queue < pair <int,int> > coada;
int verificare(int i, int j)
{
if ((i >= 0) && (i < r) && (j >= 0) && (j < c))
return 1;
return 0;
}
void bfs()
{
int r_actual, c_actual;
int v1[] = {0 , 0 , 1 , -1};
int v2[] = {1 , -1 , 0 , 0};
while ( !coada.empty() )
{
pair < int , int > cc;
cc=coada.front();
coada.pop();
for(int i=0; i<4; i++)
{
r_actual=cc.first+ v1[i];
c_actual=cc.second+ v2[i];
if ((verificare(r_actual,c_actual)) && (d[r_actual][c_actual]==0) && (m[r_actual][c_actual]!='*'))
{
d[r_actual][c_actual]=d[cc.first][cc.second] +1;
coada.push(pair< int, int >(r_actual,c_actual));
d_max=max(d_max, d[r_actual][c_actual]);
}
}
}
}
void bfss()
{
queue < pair<int,int> > bl;
queue < pair<int,int> > q;
int r_actual, c_actual;
int v1[] = {0 , 0 , 1 , -1};
int v2[] = {1 , -1 , 0 , 0};
bool valid=true;
bl.push(start);
while ((!bl.empty()) && (d_max>=0))
{
while (!bl.empty())
{
pair <int,int> cc=bl.front();
bl.pop();
q.push(cc);
}
while (!q.empty())
{
pair< int, int > cc;
cc=q.front();
q.pop();
valid=true;
for (int i=0; i<4; i++)
{
r_actual= cc.first+ v1[i];
c_actual= cc.second+ v2[i];
if ((verificare(r_actual, c_actual)) && (!viz[r_actual][c_actual]) && (d[r_actual][c_actual]>=d_max) && (m[r_actual][c_actual]!='*'))
{
viz[r_actual][c_actual]=1;
q.push(pair<int,int>(r_actual,c_actual));
valid=false;
}
}
if (valid)
{
bl.push(pair<int,int>(cc.first, cc.second));
}
}
if (viz[finish.first][finish.second])
return;
if (!bl.empty())
{
d_max--;
}
}
}
int main()
{
ifstream in("barbar.in");
ofstream out("barbar.out");
in>>r>>c;
for (int i=0; i<r; i++)
for (int j=0; j<c; j++)
{
in>>m[i][j];
if (m[i][j]=='I')
{
start=pair<int,int>(i, j);
}
else if (m[i][j]=='D')
{
coada.push(pair <int,int>(i,j));
}
else if (m[i][j]=='O')
{
finish=pair<int,int>(i,j);
}
}
bfs();
bfss();
out<<min(d_max,d[start.first][start.second]);
return 0;
}