Pagini recente » Cod sursa (job #28186) | Cod sursa (job #592467) | Cod sursa (job #1519276) | Cod sursa (job #2406615) | Cod sursa (job #2971473)
#include <cstring>
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n,m,d[1001][1001],xi,xf,yi,yf;
short int mat[1001][1001];
bool viz[1001][1001];
int dx[]={1,0,-1,0},dy[]={0,1,0,-1};
struct coada{
int l,c;
};
queue<coada>q;
int lee(int k){
memset(viz,0,sizeof(viz));
if(d[xi][yi]>k)
{
q.push({xi,yi});
viz[xi][yi]=1;
}
else
return 0;
while(!q.empty()){
int l=q.front().l;
int c=q.front().c;
q.pop();
for(int D=0;D<=3;D++){
int lv=l+dx[D];
int cv=c+dy[D];
if(lv>=1&&lv<=n&&cv>=1&&cv<=m)
{
if(mat[lv][cv]==0&&viz[lv][cv]==0&&d[lv][cv]>k)
{
viz[lv][cv]=1;
q.push({lv,cv});
}
}
}
}
return viz[xf][yf]==1;
}
int main()
{
fin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
char ch;
fin>>ch;
if(ch=='D'){
mat[i][j]=2;
q.push({i,j});
d[i][j]=1;
}
else
if(ch=='*')
mat[i][j]=1;
else
if(ch=='I')
{
xi=i;
yi=j;
}
else
if(ch=='O'){
xf=i;
yf=j;
}
}
while(!q.empty()){
int l=q.front().l;
int c=q.front().c;
q.pop();
for(int D=0;D<=3;D++){
int lv=l+dx[D];
int cv=c+dy[D];
if(lv>=1&&lv<=n&&cv>=1&&cv<=m)
{
if(mat[lv][cv]==0&&d[lv][cv]==0)
{
d[lv][cv]=d[l][c]+1;
q.push({lv,cv});
}
}
}
}
int st=0;
int dr=n*m;
int sol=-1;
while(st<=dr){
int mid=(st+dr)/2;
int ok=lee(mid);
if(ok==1)
{
sol=mid;
st=mid+1;
}
else
dr=mid-1;
}
fout<<sol;
return 0;
}