Pagini recente » Cod sursa (job #1842202) | Cod sursa (job #2974120) | Cod sursa (job #940067) | Cod sursa (job #212093) | Cod sursa (job #1866061)
#include <fstream>
using namespace std;
ifstream fin ("barbar.in");
ofstream fout ("barbar.out");
int n,m,i,j,a[1001][1001],c[2][1000001],k,p,u,st,dr,mid,ok,istart,jstart;
int ifin,jfin,ic,jc,iv,jv,d,b[1001][1001],okk;
int di[] = {1,-1,0,0};
int dj[] = {0,0,1,-1};
char x;
int main (){
fin>>n>>m;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++){
fin>>x;
if (x == '*'){
a[i][j] = -1;
b[i][j] = -1;
}
if (x == 'D'){
k++;
c[0][k] = i; // punem in coada dragonul
c[1][k] = j;
//v[k].f = i;
//v[k].s = j;
// a[i][j] = -1;
b[i][j] = -1;
}
if (x == 'I'){
istart = i;
jstart = j;
}
if (x == 'O'){
ifin = i;
jfin = j;
}
}
p = 1;
u = k;
while (p<=u){
ic = c[0][p];
jc = c[1][p];
for (d=0;d<=3;d++){
iv = ic+di[d];
jv = jc+dj[d];
if (iv>=1&&iv<=n&&jv>=1&&jv<=m&&a[iv][jv]==0){
u++;
c[0][u] = iv;
c[1][u] = jv;
a[iv][jv] = 1+a[ic][jc];
}
}
p++;
}
// cuatam binar;
st = 1;
dr = max(n,m)*max(n,m)/2;
while (st <= dr){
mid = (st+dr)/2;
// verificam daca exista drum intre istart,jstart si ifin,jfin
// care sa treaca doar prin elemente mai mari sau egala cu mid;
ok = 0;
p = 1;
u = 1;
c[0][1] = istart;
c[1][1] = jstart;
while (p<=u){
ic = c[0][p];
jc = c[1][p];
for (d=0;d<=3;d++){
iv = ic+di[d];
jv = jc+dj[d];
if (iv>=1&&iv<=n&&jv>=1&&jv<=m&&a[iv][jv]>=mid&&b[iv][jv]==0){
u++;
c[0][u] = iv;
c[1][u] = jv;
b[iv][jv] = 1+b[ic][jc];
//a[iv][jv] = 1+a[ic][jc];
if (iv==ifin && jv==jfin){
ok = 1;
okk=1;
}
}
}
p++;
}
if (ok == 1)
st = mid+1;
else
dr = mid-1;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
if (b[i][j] != -1)
b[i][j] = 0;
}
//if (dr == 0){
// fout<<0;
//return 0;
//}
// for (i=1;i<=n;i++){
// for (j=1;j<=m;j++)
// fout<<a[i][j]<<" ";
// fout<<"\n";
//}
if (okk == 0)
fout<<0;
else
fout<<dr;
return 0;
}