Pagini recente » Cod sursa (job #2068567) | Cod sursa (job #3221572) | Cod sursa (job #1682998) | Cod sursa (job #587898) | Cod sursa (job #838438)
Cod sursa(job #838438)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <queue>
#define MAX 2147483647
using namespace std;
int r,c,px,py,fx,fy,a[1010][1010],aux[1010][1010];
queue <pair <short,short> > c2;
const int dx[4]= {0,0,-1,1};
const int dy[4]= {-1,1,0,0};
inline bool ok(int x,int y) {
return x>0 && x<=r && y>0 && y<=c;
}
int bun(int t)
{
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)
aux[i][j]=0;
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)
if(a[i][j]<t) aux[i][j]=-1;
c2.push(make_pair(px,py));
aux[px][py]=1;
for(int i=1;i<=r;i++)
{
cout<<'\n';
for(int j=1;j<=c;j++)
cout<<aux[i][j]<<" ";
}
cout<<'\n';
while(!c2.empty())
{
int x=c2.front().first, y=c2.front().second;
c2.pop();
for(int i=0;i<4;i++)
{
int xv=x+dx[i], yv=y+dy[i];
if( ok(xv,yv) && aux[xv][yv]==0)
{
if(xv == fx && yv==fy)
{
while(!c2.empty())
{
c2.pop();
}
return 1;
}
aux[xv][yv]=1;
c2.push(make_pair(xv,yv));
}
}
}
return 0;
}
int caut(int st,int dr)
{
int r2=-1;
while(st<=dr)
{
int m=(st+dr)/2;
if(bun(m))
{
if(r2==-1) r2=m;
else 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] = 0;
c2.push(make_pair(i,j));
}
else if(x=='I') {px=i;py=j;a[i][j]=MAX;}
else {fx=i;fy=j;a[i][j]=MAX;}
}
fin.get();
}
while(!c2.empty())
{
int x=c2.front().first, y=c2.front().second;
c2.pop();
for(int i=0;i<4;i++)
{
int xv=x+dx[i], yv=y+dy[i];
if(ok(xv,yv) && a[xv][yv]!=-2 && a[xv][yv]!=0 && a[xv][yv] > a[x][y]+1)
{
a[xv][yv]=a[x][y]+1;
c2.push(make_pair(xv,yv));
}
}
}
/*for(int i=1;i<=r;i++)
{
cout<<'\n';
for(int j=1;j<=c;j++)
cout<<a[i][j]<<" ";
}*/
int maxim = -1;
for(int i = 1; i <= r; ++i)
for(int j = 1; j <=c; ++j) {
if(maxim < a[i][j] && a[i][j] != MAX)
maxim = a[i][j];
}
maxim = min(min(maxim, a[px][py]), a[fx][fy]);
fout<<caut(1,maxim);
return 0;
}