Pagini recente » Cod sursa (job #2163956) | Cod sursa (job #2079851) | Cod sursa (job #1763446) | Cod sursa (job #708170) | Cod sursa (job #478499)
Cod sursa(job #478499)
#include <fstream>
#include <queue>
#include <cstring>
using namespace std;
typedef struct{int x,y;} matrice;
matrice start,stop;
std::queue<matrice>c;
bool viz[1005][1005];
int dragon[1005][1005],n,m,maxim;
char a[1005][1005];
void bfs(int i,int j)
{
if((dragon[i+1][j]>dragon[i][j]+1) && (a[i+1][j]=='.')) { dragon[i+1][j]=dragon[i][j]+1;bfs(i+1,j); }
if((dragon[i-1][j]>dragon[i][j]+1) && (a[i-1][j]=='.')) { dragon[i-1][j]=dragon[i][j]+1; bfs(i-1,j); }
if((dragon[i][j+1]>dragon[i][j]+1) && (a[i][j+1]=='.')) { dragon[i][j+1]=dragon[i][j]+1; bfs(i,j+1); }
if((dragon[i][j-1]>dragon[i][j]+1) && (a[i][j-1]=='.')) { dragon[i][j-1]=dragon[i][j]+1; bfs(i,j-1); }
}
bool 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;
ifstream fi("barbar.in");
ofstream fo("barbar.out");
fi>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
fi>>a[i][j];
dragon[i][j]=int(2e9);
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]='.';}
}
maxim=0;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(a[i][j]=='D') {dragon[i][j]=0; bfs(i,j); }
// for(i=1;i<=n;i++)
// for(j=1;j<=m;j++)
// if(dragon[i][j]!=int(2e9) && dragon[i][j] >maxim) maxim=dragon[i][j];
// st=1; dr=maxim;
// while(st<dr)
// {
// if(st==dr-1)
// {
// if(bf(dr)) fo<<dr<<"\n"; else fo<<st<<"\n";
// break;
// }
// mij=(st+dr)/2;
// if(bf(mij))
// st=mij;
// else dr=mij-1;
// }
// if(st!=dr-1)
// {
// if(st==1)
// {
// if(bf(1))
// fo<<"1\n";
// else if(bf(0)) fo<<"0\n"; else fo<<"-1\n";
// } else fo<<st<<"\n";
// }
fo.close();
return 0;
}