Pagini recente » Cod sursa (job #3041218) | Cod sursa (job #2941845) | Cod sursa (job #1750144) | Cod sursa (job #2596938) | Cod sursa (job #2778940)
#include <fstream>
#include <queue>
#include <stack>
#include <cstring>
using namespace std;
const int nmax=1005;
char a[nmax][nmax];
int viz[nmax][nmax];
int d[nmax][nmax],b[nmax][nmax];
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
struct point{
int x,y;
};
queue <point> q;
stack <point> s;
int n,m;
point st,fn;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
void fill(int x,int y,int k){
int nx,ny,i;
viz[x][y]=1;
for(i=0;i<4;++i){
nx=x+dx[i];
ny=y+dy[i];
if(viz[nx][ny]==0 && d[nx][ny]>=k){
fill(nx,ny,k);
}
}
}
int valid(int k){
memset(viz,0,sizeof(viz));
fill(st.x,st.y,k);
if(viz[fn.x][fn.y]==1){
return 1;
}
return 0;
}
int bs(){
int st=1,dr=n+m,mij,last;
while(st<=dr){
mij=(st+dr)/2;
if(valid(mij)==1){
last=mij;
st=mij+1;
} else {
dr=mij-1;
}
}
return last;
}
int main()
{
int i,j;
point nou,aux;
fin>>n>>m;
for(i=1;i<=n;++i){
fin>>a[i]+1;
for(j=1;j<=m;++j){
if(a[i][j]=='.'){
b[i][j]=0;
} else if(a[i][j]=='D'){
b[i][j]=2;
aux.x=i;
aux.y=j;
viz[i][j]=1;
q.push(aux);
d[i][j]=0;
} else if(a[i][j]=='I'){
st.x=i;
st.y=j;
} else if(a[i][j]=='O'){
fn.x=i;
fn.y=j;
} else if(a[i][j]=='*'){
b[i][j]=1;
d[i][j]=0;
}
}
}
for(i=0;i<=n;++i){
b[i][0]=b[i][m+1]=1;
}
for(j=0;j<=m;++j){
b[0][j]=b[n+1][j]=1;
}
while(!q.empty()){
aux=q.front();
q.pop();
for(i=0;i<4;++i){
nou.x=aux.x+dx[i];
nou.y=aux.y+dy[i];
if(!viz[nou.x][nou.y] && b[nou.x][nou.y]==0){
q.push(nou);
viz[nou.x][nou.y]=1;
d[nou.x][nou.y]=d[aux.x][aux.y]+1;
}
}
}
fout<<bs();
return 0;
}