Pagini recente » Cod sursa (job #2978417) | Cod sursa (job #3198755) | Cod sursa (job #2272225) | Cod sursa (job #1564475) | Cod sursa (job #1598868)
#include <fstream>
#include <deque>
using namespace std;
ifstream fi ("barbar.in");
ofstream fo ("barbar.out");
deque<int> lee1,lee2,lee1f,lee2f;
deque<int>::iterator it;
char cr;
int a[1005][1005],b[1005][1005],f[2005],target,mini,sol,lin,col,i,li,lf,ci,cf,nl,nc,l,c,k,kreal,x,maxi;
int main()
{
fi>>nl>>nc;
for (l=1;l<=nl;l++)
for (c=1;c<=nc;c++)
{
fi>>cr;
if (cr=='D') {lee1.push_back(l);lee2.push_back(c);k++;a[l][c]=-2;}
if (cr=='*') a[l][c]=-1;
if (cr=='I') {li=l;ci=c;}
if (cr=='O') {lf=l;cf=c;}
}
while (!lee1.empty())
{
x++;
kreal=k;
for (i=1;i<=kreal;i++)
{
k--;
lin=lee1.back();lee1.pop_back();
col=lee2.back();lee2.pop_back();
if (lin<=nl and lin>0 and col<=nc and col>0)
{if (a[lin-1][col]==0) {a[lin-1][col]=x;k++;lee1.push_front(lin-1);lee2.push_front(col);}
if (a[lin][col+1]==0) {a[lin][col+1]=x;k++;lee1.push_front(lin);lee2.push_front(col+1);}
if (a[lin+1][col]==0) {a[lin+1][col]=x;k++;lee1.push_front(lin+1);lee2.push_front(col);}
if (a[lin][col-1]==0) {a[lin][col-1]=x;k++;lee1.push_front(lin);lee2.push_front(col-1);}}
}
}
for (l=1;l<=nl;l++)
{
for (c=1;c<=nc;c++)
{
// if (a[l][c]==-2) a[l][c]=0;
// fo<<a[l][c]<<' ';
maxi=max(a[l][c],maxi);
}
// fo<<'\n';
}
mini=-1;
sol=-1;
while (1>0)
{
for (l=1;l<=nl;l++)
for (c=1;c<=nc;c++) b[l][c]=a[l][c];
target=(maxi+mini)/2;
lee1f.push_back(li);
lee2f.push_back(ci);
if (a[li][ci]<target) target=3000;
while (!lee1f.empty())
{
lin=lee1f.back();lee1f.pop_back();
col=lee2f.back();lee2f.pop_back();
if (lin<=nl and lin>0 and col<=nc and col>0)
{if (a[lin-1][col]>=target and b[lin-1][col]!=-1) {lee1f.push_front(lin-1);lee2f.push_front(col);b[lin-1][col]=-1;}
if (a[lin][col+1]>=target and b[lin][col+1]!=-1) {lee1f.push_front(lin);lee2f.push_front(col+1);b[lin][col+1]=-1;}
if (a[lin+1][col]>=target and b[lin+1][col]!=-1) {lee1f.push_front(lin+1);lee2f.push_front(col);b[lin+1][col]=-1;}
if (a[lin][col-1]>=target and b[lin][col-1]!=-1) {lee1f.push_front(lin);lee2f.push_front(col-1);b[lin][col-1]=-1;}}
if (lin==lf and col==cf) {sol=target;break;}
}
while (!lee2f.empty()) {lee2f.pop_back();lee1f.pop_back();}
if (sol==target) mini=(maxi+mini)/2;
else maxi=(maxi+mini)/2;
if (maxi-mini<=1) break;
}
fo<<sol;
return 0;
}