Pagini recente » Cod sursa (job #1319040) | Cod sursa (job #1526512) | Cod sursa (job #2456508) | Cod sursa (job #1886471) | Cod sursa (job #1025278)
#include<iostream>
#include<fstream>
#include<queue>
#include<vector>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
#define MaxN 1010
#define Xn (Q.front().first+X[k])
#define Yn (Q.front().second+Y[k])
int N,M,Xs,Ys,Xf,Yf,Max;
int X[] = {0,-1,0,1,0}, Y[] = {0,0,1,0,-1};
char S[MaxN][MaxN];
int B[MaxN][MaxN],Best[MaxN][MaxN];
vector<pair<int,int> > List[3*MaxN];
void citire(void)
{
f >> N >> M;
for(int i=1;i<=N;i++)
f >> (S[i]+1);
}
void Lee(void)
{
queue<pair<int,int> > Q;
for(int i=1;i<=N;++i)
for(int j=1;j<=M;++j)
if(S[i][j] == 'D')
Q.push(make_pair(i,j));
else if(S[i][j] == 'O')
Xf = i, Yf = j,
S[i][j] = '.';
else if(S[i][j] == 'I')
Xs = i, Ys = j;
for(;!Q.empty();Q.pop())
for(int k=1;k<=4;k++)
if(S[Xn][Yn] == '.' && !B[Xn][Yn])
{
B[Xn][Yn] = B[Xn-X[k]][Yn-Y[k]] + 1;
Q.push(make_pair(Xn,Yn));
Max = max(Max,B[Xn][Yn]);
}
}
void Rezolvare(void)
{
Lee();
queue<pair<int,int> > Q;
for(int i=1;i<=N;i++)
for(int j=1;j<=M;j++)
Best[i][j] = -1;
for(int i=1;i<=4;i++)
if(S[Xs+X[i]][Ys+Y[i]] == '.')
List[B[Xs+X[i]][Ys+Y[i]]].push_back(make_pair(Xs+X[i],Ys+Y[i]));
for(int i=Max;i>=0;i--)
{
for(int j=0;j<List[i].size();j++)
Q.push(List[i][j]);
for(;!Q.empty();Q.pop())
for(int k=1;k<=4;k++)
if(S[Xn][Yn] == '.' && Best[Xn][Yn] == -1)
if(B[Xn][Yn] >= i)
{
Best[Xn][Yn] = i;
Q.push(make_pair(Xn,Yn));
}
else
List[B[Xn][Yn]].push_back(make_pair(Xn,Yn));
}
}
int main()
{
citire();
Rezolvare();
/* for(int i=1;i<=N;i++)
{
for(int j=1;j<=M;j++)
if(B[i][j] > -1)
cout << B[i][j];
else
cout << "X";
cout << "\n";
}*/
g << Best[Xf][Yf];
}