Pagini recente » Cod sursa (job #743263) | Cod sursa (job #1961589) | Cod sursa (job #3237444) | Cod sursa (job #836217) | Cod sursa (job #1610418)
#include<iostream>
#include<fstream>
#include<string.h>
using namespace std;
#define NMAX 1003
#define INF (1<<30)
struct coada {
int x,y;
};
char a[NMAX][NMAX];
coada c[NMAX*NMAX];
int d[NMAX][NMAX],viz[NMAX][NMAX];
int dx[]={0,-1,0,1,0};
int dy[]={0,0,1,0,-1};
void getDistances(int n, int m)
{
int i,j,st,dr;
coada aa,b;
st=1;
dr=0;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++) {
d[i][j]=INF;
if(a[i][j]=='D') {
d[i][j]=0;
c[++dr].x=i;
c[dr].y=j;
}
}
while(st<=dr) {
aa=c[st];
st++;
for(i=1;i<=4;i++) {
b.x=aa.x+dx[i];
b.y=aa.y+dy[i];
if(a[b.x][b.y]!='*' && d[b.x][b.y]>d[aa.x][aa.y]+1) {
d[b.x][b.y]=d[aa.x][aa.y]+1;
c[++dr]=b;
}
}
}
}
int possible(int n, int m, int val)
{
int i,j,st,dr;
coada aa,b;
st=1;
dr=0;
memset(viz,0,sizeof(viz));
for(i=0;i<=n+1;i++) {
viz[i][0]=1;
viz[i][m+1]=1;
}
for(j=0;i<=m+1;j++) {
viz[0][j]=1;
viz[n+1][j]=1;
}
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(a[i][j]=='I') {
c[++dr].x=i;
c[dr].y=j;
viz[i][j]=1;
if(d[i][j]<val)
return 0;
break;
}
while(st<=dr) {
aa=c[st];
st++;
for(i=1;i<=4;i++) {
b.x=aa.x+dx[i];
b.y=aa.y+dy[i];
if(a[b.x][b.y]!='*' && d[b.x][b.y]>=val && viz[b.x][b.y]==0) {
if(a[b.x][b.y]=='O')
return 1;
c[++dr]=b;
viz[b.x][b.y]=1;
}
}
}
return 0;
}
int main ()
{
int n,m,i,p,q,mij,sol;
ifstream f("barbar.in");
ofstream g("barbar.out");
f>>n>>m;
for(i=1;i<=n;i++)
f>>(a[i]+1);
f.close();
getDistances(n,m);
p=0;
q=n+m;
while(p<=q) {
mij=(p+q)/2;
if(possible(n,m,mij)) {
sol=mij;
p=mij+1;
}
else q=mij-1;
}
g<<sol;
g.close();
return 0;
}