Pagini recente » Cod sursa (job #2612651) | Cod sursa (job #300242) | Cod sursa (job #2460905) | Cod sursa (job #771991) | Cod sursa (job #419755)
Cod sursa(job #419755)
#include<fstream>
#include<deque>
using namespace std;
ifstream f1 ("barbar.in");
ofstream f2 ("barbar.out");
short 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 <short int, short 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 (x+dlin[j]>=0 && y+dcol[j]>=0){
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 bf_2()
{
int x,y,j;
memset (valid,0, sizeof (valid));
if (a[startx][starty]!=-2 && a[startx][starty]!=-1) valid[startx][starty]=1; else return 0;
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 (x+dlin[j]>=0 && y+dcol[j]>=0){
if (valid[x+dlin[j]][y+dcol[j]]==0 && a[x+dlin[j]][y+dcol[j]]!=-2 && a[x+dlin[j]][y+dcol[j]]!=-1)
{
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);
for (i=0; step; step>>=1)
if (ver_bf(i+step)) i+=step;
if (i!=0) f2<<i;
else if (bf_2()==0) f2<<-1; else f2<<0;
return 0;
}