Pagini recente » Cod sursa (job #501208) | Cod sursa (job #2792555) | Cod sursa (job #986101) | Cod sursa (job #877411) | Cod sursa (job #1081406)
//
// 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;
bool viz[nru][nru];
queue<ind> q;
ind kn;
void initializare()
{int i,j;
for (i=1;i<=r;++i) for (j=1;j<=C;++j) a[i][j]=false;
}
bool perfeeect(int i,int j,int m)
{ind w;
if (i!=1 && a[i-1][j]>=m && !viz[i-1][j])
{
if (i-1==kn.c && j==kn.d) return true;
w.c=i-1;
w.d=j;
q.push(w);
viz[i-1][j]=true;
}
if (i!=r && a[i+1][j]>=m && !viz[i+1][j])
{
if (i+1==kn.c && j==kn.d) return true;
w.c=i+1;
w.d=j;
q.push(w);
viz[i+1][j]=true;
}
if (j!=1 && a[i][j-1]>=m && !viz[i][j-1])
{
if (i==kn.c && j-1==kn.d) return true;
w.c=i;
w.d=j-1;
q.push(w);
viz[i][j-1]=true;
}
if (j!=C && a[i][j+1]>=m && !viz[i][j+1])
{
if (i==kn.c && j+1==kn.d) return true;
w.c=i;
w.d=j+1;
q.push(w);
viz[i][j+1]=true;
}
return false;
}
int main(int argc, const char * argv[])
{int i,j,x,y,z,t,k,l;
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;
}
initializare();
while (!q.empty())
{
i=q.front().c;
j=q.front().d;
if (i!=1 && a[i-1][j]==-1 && !viz[i][j-1])
{
a[i-1][j]=a[i][j]+1;
viz[i-1][j]=true;
w.c=i-1;
w.d=j;
q.push(w);
}
if (i!=r && a[i+1][j]==-1 && !viz[i+1][j])
{viz[i+1][j]=true;
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 && !viz[i][j-1])
{
viz[i][j-1]=true;
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 && !viz[i][j+1])
{viz[i][j+1]=true;
a[i][j+1]=a[i][j]+1;
w.c=i;
w.d=j+1;
q.push(w);
}
q.pop();
}
i=x;j=y;
kn.c=z;
kn.d=t;
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)
{
initializare();
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;
}