Pagini recente » Cod sursa (job #351750) | Cod sursa (job #2017006) | Cod sursa (job #2014310) | Cod sursa (job #201417) | Cod sursa (job #203425)
Cod sursa(job #203425)
#include <fstream>
#include <queue>
using namespace std;
#define mp make_pair
#define x first
#define y second
const int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
int R,C,xp,yp,b[1001][1001];
char a[1001][1001];
queue< pair<int,int> > q;
void read(){
int i,j,k;
ifstream f("barbar.in");
f>>R>>C;
for (i=1;i<=R;++i)
for (j=1;j<=C;++j){
f>>a[i][j];
if (a[i][j]=='D') q.push(mp(i,j));
if (a[i][j]=='I') xp=i,yp=j;
}
while (!q.empty()){
i=q.front().x;
j=q.front().y;
q.pop();
for (k=0;k<4;++k)
if (i+dx[k]<=R && i+dx[k]>=1)
if (j+dy[k]<=C && j+dy[k]>=1)
if (a[i+dx[k]][j+dy[k]]!='*')
if (a[i+dx[k]][j+dy[k]]!='D')
if (b[i+dx[k]][j+dy[k]]==0){
b[i+dx[k]][j+dy[k]]=b[i][j]+1;
q.push(mp(i+dx[k],j+dy[k]));}
}
}
bool u[1001][1001];
int IsSolution(int D){
int i,j,k;
while (!q.empty()) q.pop();
memset(u,false,sizeof(u));
q.push(mp(xp,yp));
u[xp][yp]=true;
while (!q.empty()){
i=q.front().x;
j=q.front().y;
q.pop();
for (k=0;k<4;++k)
if (i+dx[k]<=R && i+dx[k]>=1)
if (j+dy[k]<=C && j+dy[k]>=1)
if (!u[i+dx[k]][j+dy[k]])
if (b[i+dx[k]][j+dy[k]]>=D){
u[i+dx[k]][j+dy[k]]=true;
q.push(mp(i+dx[k],j+dy[k]));
if (a[i+dx[k]][j+dy[k]]=='O') return 1;
}
}
return 0;
}
void solve(){
int ls=0,ld=b[xp][yp],mij,sol=-1;
ofstream g("barbar.out");
while (ls<=ld){
mij=(ls+ld)/2;
if (IsSolution(mij)) sol=mij,ls=mij+1;
else ld=mij-1;
}
g<<sol;
}
int main(){
read();
solve();
return 0;
}