Pagini recente » Cod sursa (job #2104619) | Cod sursa (job #3179096) | Cod sursa (job #784846) | Cod sursa (job #423940) | Cod sursa (job #419732)
Cod sursa(job #419732)
#include<fstream>
#include<deque>
using namespace std;
ifstream f1 ("barbar.in");
ofstream f2 ("barbar.out");
int r,c,a[1005][1005],best[1005][1005];
int startx,starty,finx,finy;
bool valid[1005][1005];
const int dlin[]={0,0,1,-1}, dcol[]={1,-1,0,0};
deque < pair <int, int> > q;
int ver_bf (int k)
{
int x,y,j;
if (k!=0) if (a[startx][starty]<k) return 0;
memset (valid,0, sizeof (valid));
valid[startx][starty]=1;
q.push_back (make_pair(startx, starty));
while (!q.empty())
{
x=q.front().first;
y=q.front().second;
for (j=0; j<=3; j++)
if (valid[x+dlin[j]][y+dcol[j]]==0 && a[x+dlin[j]][y+dcol[j]]>=k)
{
//f2<<x+dlin[j]<<" "<<y+dcol[j]<<"D"<<endl;
q.push_back(make_pair(x+dlin[j],y+dcol[j]));
valid[x+dlin[j]][y+dcol[j]]=1;
}
q.pop_front();
}
if (valid[finx][finy]) return 1;
return 0;
}
int main()
{
int i,j,x,y;
char ch;
f1>>r>>c;
for (i=1; i<=r; i++)
{
f1.get(ch);
for (j=1; j<=c; j++)
{
f1.get(ch);
if (ch=='.') a[i][j]=-1;
if (ch=='*') a[i][j]=-2;
if (ch=='I') {startx=i; starty=j; a[i][j]=-1;}
if (ch=='O') {finx=i; finy=j; a[i][j]=-1;}
if (ch=='D') q.push_back (make_pair (i,j));
}
}
for (i=0; i<=r+1; i++) a[0][i]=a[r+1][i]=-2;
for (j=0; j<=c+1; j++) a[j][0]=a[j][c+1]=-2;
while (!q.empty())
{
x=q.front().first;
y=q.front().second;
for (j=0; j<=3; j++)
if (a[x+dlin[j]][y+dcol[j]]==-1 || a[x+dlin[j]][y+dcol[j]]>-1 && a[x][y]+1<a[x+dlin[j]][y+dcol[j]])
{q.push_back(make_pair (x+dlin[j], y+dcol[j])); a[x+dlin[j]][y+dcol[j]]=a[x][y]+1;}
q.pop_front();
}
int step=1;
for (step=1; step<=c*r; step<<=1);
if (r*c<100000 && ver_bf(0)==0) f2<<"-1";
else
{for (i=0; step; step>>=1)
if (ver_bf(i+step)) i+=step;
f2<<i;}
return 0;
}