Pagini recente » Cod sursa (job #273507) | Cod sursa (job #1255774) | Cod sursa (job #2506544) | Cod sursa (job #1963842) | Cod sursa (job #2361860)
#include <iostream>
#include <fstream>
#include <queue>
#include <cstring>
#include <vector>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n,m,a[1010][1010]={1000},istart,jstart,ifinal,jfinal,f[1010][1010],maxim,dragoni,nrd;
char x;
vector <pair<int,int>> v;
struct nod{
int x;
int y;
int d;
};
int di[4] = {0, 0, 1, -1};
int dj[4] = {1, -1, 0 ,0};
queue <nod> coada;
bool lee(int lim){
queue <nod> coada2;
memset(f,0,sizeof f);
f[istart][jstart]=1;
coada2.push({istart,jstart,0});
while(!coada2.empty()){
nod curent=coada2.front();
coada2.pop();
int i=curent.x,j=curent.y;
if(i==ifinal&&j==jfinal){
return true;
}
for(int t=0;t<4;t++){
int i2=i+di[t];
int j2=j+dj[t];
if(i2>0&&i2<=n&&j2>0&&j2<=m&&a[i2][j2]!=-1&&f[i2][j2]==0&&a[i2][j2]!=-2&&a[i2][j2]>=lim){
f[i2][j2]=1;
coada2.push({i2,j2,0});
}
}
}
return 0;
}
void leeDragoni(){
memset(f,0,sizeof f);
//f[si][sj]=1;
//coada.push({si,sj,0});
while(!coada.empty()){
nod curent=coada.front();
coada.pop();
int i=curent.x, j=curent.y, dist=curent.d;
f[i][j]=1;
if(a[i][j]==0)
a[i][j]=dist;
else
a[i][j]=min(dist,a[i][j]);
// if(dragoni==nrd)
// maxim=max(a[i][j],maxim);
for(int t=0;t<4;t++){
int i2=i+di[t];
int j2=j+dj[t];
if(i2>0&&i2<=n&&j2>0&&j2<=m&&a[i2][j2]!=-1&&f[i2][j2]==0&&a[i2][j2]!=-2){
f[i2][j2]=1;
coada.push({i2,j2,dist+1});
}
}
}
}
int main(){
fin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
fin>>x;
if(x=='D'){
a[i][j]=-2;
nrd++;
v.push_back(make_pair(i,j));
coada.push({i,j,0});
}
if(x=='.')
a[i][j]=0;
if(x=='*')
a[i][j]=-1;
if(x=='I'){
a[i][j]=0;
istart=i;
jstart=j;
}
if(x=='O'){
a[i][j]=0;
ifinal=i;
jfinal=j;
}
}
// for(int i=0;i<v.size();i++){
// dragoni++;
leeDragoni();
// }
/* for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}*/
int st=1,dr=n*m+1;
while(st<=dr){
int mid=(st+dr)/2;
if(lee(mid)){
st=mid+1;
// cout<<mid<<" "<<dr<<" "<<st<<endl;
}
else
dr=mid-1;
}
// cout<<lee(2);
fout<<dr;
return 0;
}