Pagini recente » Cod sursa (job #793704) | Cod sursa (job #923482) | Cod sursa (job #2863983) | Cod sursa (job #4181) | Cod sursa (job #2952018)
#include <iostream>
#include <fstream>
#include <bits/stdc++.h>
#define nmax 1005
#define abs(a,b) ((a>b)?(a-b):(b-a))
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n,m;
int mat[nmax][nmax];
int ras[nmax][nmax];
int om[nmax][nmax];
int istop,jstop,istart,jstart;
queue<pair<int,int>>Q;
vector<pair<int,int>>Vec;
const int di[4]={1,0,-1,0};
const int dj[4]={0,1,0,-1};
bool ebun(int i,int j)
{
return i>=1 && i<=n && j>=1 && j<=m;
}
void citire()
{
fin>>n>>m;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
{
char lit;
fin>>lit;
if(lit=='I')
{
istart=i;
jstart=j;
}
else if(lit=='O')
{
istop=i;
jstop=j;
}
else if(lit=='*')
mat[i][j]=1;
else if(lit=='D')
{
mat[i][j]=1;
ras[i][j]=1;
Q.push({i,j});
}
}
}
void LeeDragoni()
{
while(!Q.empty())
{
int i=Q.front().first;
int j=Q.front().second;
Q.pop();
for (int dir=0;dir<4;++dir)
{
int i_nou=i+di[dir];
int j_nou=j+dj[dir];
if(ebun(i_nou,j_nou) && ras[i_nou][j_nou]==0)
{
ras[i_nou][j_nou]=ras[i][j]+1;
Q.push({i_nou,j_nou});
}
}
}
while(!Q.empty())
Q.pop();
}
bool LeeOm(int pas)
{
Q.push({istart,jstart});
om[istart][jstart]=pas;
while(!Q.empty())
{
int i=Q.front().first;
int j=Q.front().second;
Q.pop();
for (int dir=0;dir<4;++dir)
{
int i_nou=i+di[dir];
int j_nou=j+dj[dir];
if(ebun(i_nou,j_nou) && mat[i_nou][j_nou]==0 && ras[i_nou][j_nou]>=pas && om[i_nou][j_nou]!=pas)
{
om[i_nou][j_nou]=pas;
Q.push({i_nou,j_nou});
}
}
}
if(om[istop][jstop]==pas)
return true;
return false;
}
int main()
{citire();
LeeDragoni();
int st=2,dr=ras[istart][jstart];
int rez=0;
while(st<=dr)
{
int mid=(st+dr)/2;
if(LeeOm(mid))
{
rez=mid;
st=mid+1;
}
else dr=mid-1;
}
cout<<rez-1;
return 0;
}