Pagini recente » Cod sursa (job #1885001) | Cod sursa (job #1098639) | Cod sursa (job #2661414) | Cod sursa (job #2183920) | Cod sursa (job #478535)
Cod sursa(job #478535)
#include <fstream>
#include <queue>
#include <cstring>
using namespace std;
typedef struct{int x,y;} matrice;
matrice start,stop;
std::queue<matrice>c;
bool ok;
int dragon[1005][1005],n,m,maxim,viz[1005][1005];
char a[1005][1005];
void bfs(void)
{
int i,j;
matrice elem;
while(!c.empty())
{
elem=c.front();
c.pop();
i=elem.x; j=elem.y;
if((!dragon[i+1][j]) && (a[i+1][j]=='.')) { dragon[i+1][j]=dragon[i][j]+1; elem.x=i+1; elem.y=j; c.push(elem);}
if((!dragon[i-1][j]) && (a[i-1][j]=='.')) { dragon[i-1][j]=dragon[i][j]+1; elem.x=i-1; elem.y=j; c.push(elem); }
if((!dragon[i][j+1]) && (a[i][j+1]=='.')) { dragon[i][j+1]=dragon[i][j]+1; elem.x=i; elem.y=j+1; c.push(elem); }
if((!dragon[i][j-1]) && (a[i][j-1]=='.')) { dragon[i][j-1]=dragon[i][j]+1; elem.x=i; elem.y=j-1; c.push(elem); }
}
}
int bf(int dist)
{
int i,j;
matrice nod,elem;
memset(viz,0,sizeof(viz));
c=std::queue<matrice>();
if(dragon[start.x][start.y]<dist) return 0;
c.push(start);
viz[start.x][start.y]=1;
while(!c.empty())
{
nod=c.front();
i=nod.x; j=nod.y;
c.pop();
if((dragon[i+1][j]>=dist)&&(!viz[i+1][j])&&(a[i+1][j]!='*')) { viz[i+1][j]=1; elem.x=i+1; elem.y=j; c.push(elem); if(elem.x==stop.x && elem.y==stop.y) break; }
if((dragon[i-1][j]>=dist)&&(!viz[i-1][j])&&(a[i-1][j]!='*')) { viz[i-1][j]=1; elem.x=i-1; elem.y=j; c.push(elem); if(elem.x==stop.x && elem.y==stop.y) break;}
if((dragon[i][j+1]>=dist)&&(!viz[i][j+1])&&(a[i][j+1]!='*')) { viz[i][j+1]=1; elem.x=i; elem.y=j+1; c.push(elem);if(elem.x==stop.x && elem.y==stop.y) break; }
if((dragon[i][j-1]>=dist)&&(!viz[i][j-1])&&(a[i][j-1]!='*')) { viz[i][j-1]=1; elem.x=i; elem.y=j-1; c.push(elem); if(elem.x==stop.x && elem.y==stop.y)break;}
}
if(viz[stop.x][stop.y]) return 1; else return 0;
}
int main()
{
int i,j,st,dr,mij;
matrice el;
ifstream fi("barbar.in");
ofstream fo("barbar.out");
memset(viz,0,sizeof(viz));
fi>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
fi>>a[i][j];
if(a[i][j]=='I') { start.x=i; start.y=j; a[i][j]='.';}
if(a[i][j]=='O') {stop.x=i; stop.y=j; a[i][j]='.';}
if(a[i][j]=='D') el.x=i,el.y=j, c.push(el);
}
bfs();
maxim=0;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(dragon[i][j] && dragon[i][j] >maxim) maxim=dragon[i][j];
st=1; dr=maxim;
ok=1;
while(st<dr)
{
if(st==dr-1 && st!=1)
{
if(bf(dr)) fo<<dr<<"\n"; else
if(bf(st)) fo<<st<<"\n"; else
fo<<"-1\n";
ok=0;
break;
}
mij=(st+dr)/2;
if(bf(mij))
st=mij;
else dr=mij-1;
}
if((st==1)&&ok&&(bf(1))) fo<<"1\n"; else
if((st==1)&&ok&&(bf(0))) fo<<"0\n"; else
if((st!=1)&&ok) fo<<st<<"\n";
fo.close();
return 0;
}