Pagini recente » Cod sursa (job #1977497) | Cod sursa (job #2288491) | Cod sursa (job #599295) | Cod sursa (job #992694) | Cod sursa (job #1077267)
//
// main.cpp
// barbar
//
// Created by Catalina Brinza on 1/10/14.
// Copyright (c) 2014 Catalina Brinza. All rights reserved.
//
#include <fstream>
#include <queue>
#define nru 1001
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
struct ind
{
int d,c;
};
int a[nru][nru],c,r;
queue<ind> q;
int z,t;
bool perfeeect(int i,int j,int m)
{ind w;
if (i!=1 && a[i-1][j]>=m)
{
if (i-1==z && j==t) return true;
w.c=i-1;
w.d=j;
q.push(w);
}
if (i!=r && a[i+1][j]>=m)
{
if (i+1==z && j==t) return true;
w.c=i+1;
w.d=j;
q.push(w);
}
if (j!=1 && a[i][j-1]>=m)
{
if (i==z && j-1==t) return true;
w.c=i;
w.d=j-1;
q.push(w);
}
if (j!=c && a[i][j+1]>=m)
{
if (i==z && j+1==t) return true;
w.c=i;
w.d=j+1;
q.push(w);
}
return false;
}
int main(int argc, const char * argv[])
{int i,j,x,y,z,t;
char car;
ind w;
in>>r>>c;
for (i=1;i<=r;++i)
for (j=1;j<=c;++j)
{
in>>car;
if (car=='I')
{
x=i; y=j;a[i][j]=-1;
}
else if (car=='O')
{
z=i;
t=j;
a[i][j]=-1;
}
else if (car=='D') {
a[i][j]=0;
w.c=i;
w.d=j;
q.push(w);
}
else if (car=='*') a[i][j]=-2;
else
a[i][j]=-1;
}
while (!q.empty())
{
i=q.front().c;
j=q.front().d;
if (i!=1 && a[i-1][j]==-1)
{
a[i-1][j]=a[i][j]+1;
w.c=i-1;
w.d=j;
q.push(w);
}
if (i!=r && a[i+1][j]==-1)
{
a[i+1][j]=a[i][j]+1;
w.c=i+1;
w.d=j;
q.push(w);
}
if (j!=1 && a[i][j-1]==-1)
{
a[i][j-1]=a[i][j]+1;
w.c=i;
w.d=j-1;
q.push(w);
}
if (j!=c && a[i][j+1]==-1)
{
a[i][j+1]=a[i][j]+1;
w.c=i;
w.d=j+1;
q.push(w);
}
q.pop();
}
i=x;j=y;
int min,max,mij; bool ok=false;
if (a[i][j]<a[z][t]) {min=a[i][j];max=a[t][z];}
else {max=a[i][j]; min=a[z][t];}
while (max>min)
{
mij=min+(max-min)/2;
w.c=i;
w.d=j;
q.push(w);
while (!q.empty())
{
if (perfeeect(q.front().c,q.front().d,mij))
{
min=mij;
ok=true;
while(!q.empty()) q.pop();
break;
}
q.pop();
}
if (min!=mij) max=mij;
}
out<<max;
return 0;
}