Pagini recente » Cod sursa (job #3283168) | Cod sursa (job #408019) | Cod sursa (job #3271351) | Cod sursa (job #2176917) | Cod sursa (job #3281912)
#include<fstream>
#include<queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int N , M , D[1001][1001] , V[1001][1001];
int LinS , ColS , LinF , ColF;
queue<pair<int,int>>Q;
bool inmat(int i , int j){
return i>=1 && i<=N && j>=1 && j<=M;
}
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
void Fill(){
while(!Q.empty()){
int Lin1=Q.front().first , Col1=Q.front().second;
Q.pop();
for(int k=0 ; k<4 ; k++){
int Lin2=Lin1+dx[k] , Col2=Col1+dy[k];
if(inmat(Lin2,Col2)){
if(D[Lin2][Col2]>=0 && D[Lin1][Col1]<=-1){
D[Lin2][Col2]=D[Lin1][Col1]+1;
Q.push(make_pair(Lin2,Col2));
}
}
}
}
}
void Drum(){
D[LinS][ColS]=1;
Q.push(make_pair(LinS,ColS));
while(!Q.empty()){
int Lin1=Q.front().first , Col1=Q.front().second;
Q.pop();
for(int k=0 ; k<4 ; k++){
int Lin2=Lin1+dx[k] , Col2=Col1+dy[k];
if(inmat(Lin2,Col2)){
if(D[Lin2][Col2] == 0){
D[Lin2][Col2]=D[Lin1][Col1]+1;
Q.push(make_pair(Lin2,Col2));
}
}
}
}
}
void Reset(){
for(int i=1 ; i<=N ; i++)
for(int j=1 ; j<=M ; j++)
D[i][j]=V[i][j];
}
int main()
{
fin>>N>>M;
fin.get();
for(int i=1 ; i<=N ; i++){
char S[1001];
fin>>S;
for(int j=1 ; j<=M ; j++){
if(S[j-1] == '*')
V[i][j]=0; /// Zid
if(S[j-1] == '-')
V[i][j]=0;
if(S[j-1] == 'I'){
LinS=i;
ColS=j;
}
if(S[j-1] == 'O'){
LinF=i;
ColF=j;
}
if(S[j-1] == 'D'){
V[i][j]=-2;
}
D[i][j]=V[i][j];
}
}
int R=-1;
for(int Val=1 ; Val<=N ; Val++){
for(int i=1 ; i<=N ; i++)
for(int j=1 ; j<=M ; j++)
if(D[i][j] == -2){
D[i][j]=(-1)*Val;
Q.push(make_pair(i,j));
}
Fill();
if(D[LinS][ColS] == 0){
Drum();
if(D[LinF][ColF] > 0)
R=Val;
else
break;
}
else
break;
/*
for(int i=1 ; i<=N ; i++ , fout<<'\n')
for(int j=1 ; j<=M ; j++)
fout<<D[i][j]<<' ';
*/
Reset();
}
fout<<R<<'\n';
return 0;
}