Pagini recente » Cod sursa (job #2072747) | Cod sursa (job #1880561) | Cod sursa (job #2639868) | Cod sursa (job #682021) | Cod sursa (job #2074226)
#include<bits/stdc++.h>
using namespace std;
#define MAXN 1001
int v[MAXN][MAXN], f[MAXN][MAXN], drum[MAXN][MAXN], q[MAXN*MAXN][2];
int dirl[5]={0, -1, 0, 1, 0};
int dirc[5]={0, 0, 1, 0, -1};
void bfs(int st, int dr){
int i;
int l, c, lin, col;
while(st<=dr){
l=q[st][0];
c=q[st][1];
st++;
for(i=1; i<=4; i++){
lin=l+dirl[i]; col=c+dirc[i];
if(v[lin][col]!=-1 && f[lin][col]==0){
drum[lin][col]=drum[l][c]+1;
dr++;
q[dr][0]=lin; q[dr][1]=col;
f[lin][col]=1;
}
}
}
}
int main(){
FILE*fin=fopen("barbar.in", "r");
FILE*fout=fopen("barbar.out", "w");
int n, m, i, j, drag, sl, sc, fl, fc;
int maxim, left, right, dist, ans, st, dr, ok;
int l, c, lin, col;
char ch;
fscanf(fin, "%d%d", &n, &m);
fgetc(fin);
drag=0;
for(i=1; i<=n; i++){
for(j=1; j<=m; j++){
ch=fgetc(fin);
if(ch=='*'){
v[i][j]=-1;
drum[i][j]=-1;
}
if(ch=='I'){
sl=i;
sc=j;
}
if(ch=='D'){
drag++;
q[drag][0]=i;
q[drag][1]=j;
f[i][j]=1;
}
if(ch=='O'){
fl=i;
fc=j;
}
}
fgetc(fin);
}
for(i=0; i<=n+1; i++)
v[i][0]=v[i][m+1]=-1;
for(j=0; j<=m+1; j++)
v[0][j]=v[n+1][j]=-1;
bfs(1, drag);
maxim=0;
for(i=1; i<=n; i++)
for(j=1; j<=m; j++){
f[i][j]=0;
if(drum[i][j]>maxim)
maxim=drum[i][j];
}
left=0; right=maxim+10;
ans=-1;
while(left<=right){
dist=(left+right)/2;
q[1][0]=sl; q[1][1]=sc;
f[sl][sc]=1;
st=1; dr=1;
ok=0;
while(st<=dr && ok==0){
l=q[st][0];
c=q[st][1];
for(i=1; i<=4; i++){
lin=l+dirl[i]; col=c+dirc[i];
if(v[lin][col]!=-1 && f[lin][col]==0 && drum[lin][col]>=dist){
dr++;
q[dr][0]=lin; q[dr][1]=col;
f[lin][col]=1;
}
}
st++;
}
if(f[fl][fc]==1){
ans=dist;
left=dist+1;
}
else{
right=dist-1;
}
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
f[i][j]=0;
}
fprintf(fout, "%d", ans);
return 0;
}