Pagini recente » Cod sursa (job #1468524) | Cod sursa (job #1484234) | Cod sursa (job #89525) | Cod sursa (job #2346351) | Cod sursa (job #682162)
Cod sursa(job #682162)
#include <cstdio>
#include <iostream>
#include <string>
#include <deque>
using namespace std;
pair<int,int> start,t;
int xx[]={1,-1,0,0};
int yy[]={0,0,-1,1};
char h[1005][1005];
bool viz[1005][1005];
int dp[1005][1005],n,m,X;
string ln;
deque<pair<int,int> > d;
bool lee2();
int cautbin()
{
int li=0,ls=n+m,mij,rez=-1;
while(li<=ls)
{
mij=(li+ls)/2;
X=mij;
bool ok=lee2();
if(ok==true)// exista drum
rez=mij,li=mij+1;
if(ok==false) // nu exista drum
ls=mij-1;
}
return rez;
}
void full()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
dp[i][j]=1<<30;
}
void clrviz(bool viz[1005][1005]) // pozitiile la care se poate ajunge
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
viz[i][j]=0;
}
bool lee2()// verificam drumul
{
clrviz(viz);
d.push_back(make_pair(start.first,start.second));// poz de inceput
if(dp[start.first][start.second]>=X)
while(d.size())
{
int x=d.front().first;
int y=d.front().second;
d.pop_front();
for(int t=0;t<4;t++)
{
int i=x+xx[t];
int j=y+yy[t];
if(i>=1 && i<=n && j>=1 && j<=m && dp[i][j]>=X && viz[i][j]==0 && h[i][j]!='*')
{
viz[i][j]=1;
d.push_back(make_pair(i,j));
}
}
}
return viz[t.first][t.second]; // daca se poate ajunge/nu pe pozitia de final
}
void lee() // versiunea 1.0Dragons
{
while(d.size())
{
int x=d.front().first;
int y=d.front().second;
d.pop_front();
for(int t=0;t<4;t++)
{
int i=x+xx[t];
int j=y+yy[t];
if(i>=1 && i<=n && j>=1 && j<=m && dp[x][y]+1<dp[i][j])
{
dp[i][j]=dp[x][y]+1;
d.push_back(make_pair(i,j));
}
}
}
}
int main()
{
freopen("barbar.in","r", stdin);
freopen("barbar.out","w", stdout);
scanf("%d %d\n",&n,&m);
full();
for(int i=1;i<=n;i++)
{
getline(cin,ln);
for(int j=1;j<=m;j++)
{
h[i][j]=ln[j-1];
if(h[i][j]=='D')
{
d.push_back(make_pair(i,j));
dp[i][j]=0;
}
if(h[i][j]=='O')
t.first=i,t.second=j;
if(h[i][j]=='I')
start.first=i,start.second=j;
}
}
lee(); // initial pentru dragoni
printf("%d",cautbin());
return 0;
}