Pagini recente » Cod sursa (job #794157) | Cod sursa (job #3174244) | Cod sursa (job #1857105) | Cod sursa (job #1035908) | Cod sursa (job #838267)
Cod sursa(job #838267)
#include <iostream>
#include <fstream>
#include <algorithm>
#define MAX 2147483647
using namespace std;
int r,c,px,py,fx,fy,a[1010][1010],xd[1010],yd[1010],poz=1,c2[2][1000001],aux[1010][1010];
void marcare(int x)
{
a[xd[x]][yd[x]]=0;
int dr=1;
c2[0][1]=xd[x];
c2[1][1]=yd[x];
for(int i=1;i<=dr;i++)
{
if(a[c2[0][i]][c2[1][i]]+1<a[c2[0][i]+1][c2[1][i]])
{
a[c2[0][i]+1][c2[1][i]]=a[c2[0][i]][c2[1][i]]+1;
c2[0][++dr]=c2[0][i]+1;
c2[1][dr]= c2[1][i];
}
if(a[c2[0][i]][c2[1][i]]+1<a[c2[0][i]-1][c2[1][i]])
{
a[c2[0][i]-1][c2[1][i]]=a[c2[0][i]][c2[1][i]]+1;
c2[0][++dr]=c2[0][i]-1;
c2[1][dr]= c2[1][i];
}
if(a[c2[0][i]][c2[1][i]]+1<a[c2[0][i]][c2[1][i]+1])
{
a[c2[0][i]][c2[1][i]+1]=a[c2[0][i]][c2[1][i]]+1;
c2[0][++dr]=c2[0][i];
c2[1][dr]= c2[1][i]+1;
}
if(a[c2[0][i]][c2[1][i]]+1<a[c2[0][i]][c2[1][i]-1])
{
a[c2[0][i]][c2[1][i]-1]=a[c2[0][i]][c2[1][i]]+1;
c2[0][++dr]=c2[0][i];
c2[1][dr]= c2[1][i]-1;
}
}
}
int bun(int t)
{
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)
aux[i][j]=0;
cout<<t;
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)
if(a[i][j]<t) aux[i][j]=-1;
cout<<"\n";
for(int i=1;i<=r;i++)
{
cout<<"\n";
for(int j=1;j<=c;j++)
cout<<aux[i][j]<<" ";
}
int dr=1;
if(aux[px][py]!=-1)
{
aux[px][py]=1;
for(int i=1;i<=dr;i++)
{
if(aux[c2[0][i]+1][c2[1][i]]== 0)
{
aux[c2[0][i]+1][c2[1][i]]=1;
c2[0][++dr]=c2[0][i]+1;
c2[1][dr]= c2[1][i];
}
if(a[c2[0][i]-1][c2[1][i]]==0)
{
a[c2[0][i]-1][c2[1][i]]=1;
c2[0][++dr]=c2[0][i]-1;
c2[1][dr]= c2[1][i];
}
if(a[c2[0][i]][c2[1][i]+1]==0)
{
a[c2[0][i]][c2[1][i]+1]=1;
c2[0][++dr]=c2[0][i];
c2[1][dr]= c2[1][i]+1;
}
if(a[c2[0][i]][c2[1][i]-1]==0)
{
a[c2[0][i]][c2[1][i]-1]=1;
c2[0][++dr]=c2[0][i];
c2[1][dr]= c2[1][i]-1;
}
}
}
if(aux[px][py] == 1) return 1;
return 0;
}
int caut(int st,int dr)
{
int r2=dr+1;
while(st<=dr)
{
int m=(st+dr)/2;
if(bun(m))
{
if(m<r2) r2=m;
st=m+1;
}
else
dr=m-1;
}
return r2;
}
int main()
{
//citire
ifstream fin("barbar.in");
ofstream fout("barbar.out");
fin>>r>>c;
fin.get();
for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)
{
char x;
fin.get(x);
if(x=='.') a[i][j]=MAX;
else if(x=='*') a[i][j]=-2;
else if(x=='D')
{
a[i][j]=-1;
xd[poz]=i;
yd[poz++]=j;
}
else if(x=='I') {px=i;py=j;a[i][j]=MAX;}
else {fx=i;fy=j;a[i][j]=MAX;}
}
fin.get();
}
poz--;
for(int i=1;i<=poz;i++)
marcare(i);
/*for(int i=1;i<=r;i++)
{
fout<<"\n";
for(int j=1;j<=c;j++)
fout<<a[i][j]<<" ";
}*/
int ma=max(r,c);
fout<<caut(1,ma);
return 0;
}