Pagini recente » Cod sursa (job #903047) | Cod sursa (job #465247) | Cod sursa (job #1527043) | Cod sursa (job #942901) | Cod sursa (job #2292308)
#include <iostream>
#include<cstdio>
#include<string.h>
using namespace std;
const int N=1005;
const int BORD=1;
const int NEFOL=-1;
const int BORDDRAG=1<<30;
int dl[]={-1,0,1,0};
int dc[]={0,1,0,-1};
struct poz{
int lin,col;
bool operator == (poz x) const{
if(x.lin==lin && x.col==col)
return true;
return false;
}
};
bool mat[N][N];
poz q[N*N];
poz drag[N*N];
int distdr[N][N];
bool viz[N][N];
poz start,finish;
int n,m;
bool verifpozmat(int i,int j){
if((i>=1 && i<=n) && (j>=1 && j<=m))
return true;
return false;
}
void bordam(bool v[N][N],int nn,int mm){
for(int i=0;i<=nn+1;i++){
v[i][mm]=v[i][0]=BORD;
}
for(int j=0;j<=mm+1;j++){
v[nn][j]=v[0][j]=BORD;
}
}
bool verif(poz a,int dist){
if(distdr[a.lin][a.col]!=BORDDRAG && (distdr[a.lin][a.col]==NEFOL || distdr[a.lin][a.col]>=dist) )
return true;
return false;
}
bool check(int dist){
poz x,y;
memset(q,0,sizeof(q));
memset(viz,0,sizeof(viz));
bordam(viz,n,m);
int st=1,dr=0;
q[++dr]=start;
while(st<=dr){
x=q[st];
if(x==finish){
return true;
}
viz[x.lin][x.col]=true;
for(int i=0;i<4;i++){
y.col=x.col+dc[i];
y.lin=x.lin+dl[i];
if(verifpozmat(y.lin,y.col) && mat[y.lin][y.col]==0 && viz[y.lin][y.col]==0 && verif(y,dist)){
q[++dr]=y;
}
}
st++;
}
return false;
}
int cautbin(){
int pas=0,p2=1<<15;
while(p2>0){
if((pas+p2<=n || pas+p2<=m) && check(pas+p2)){
pas+=p2;
}
p2/=2;
}
return pas;
}
int main()
{
FILE*fin,*fout;
fin=fopen("barbar.in","r");
fout=fopen("barbar.out","w");
int i,j;
int stdr=1,drdr=0;
char c;
fscanf(fin,"%d%d ",&n,&m);
memset(distdr,NEFOL,sizeof(distdr));
for(i=0;i<=n+1;i++){
distdr[i][m]=distdr[i][0]=BORDDRAG;
}
for(j=0;j<=m+1;j++){
distdr[n][j]=distdr[0][j]=BORDDRAG;
}
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
c=fgetc(fin);
if(c=='D'){
drag[++drdr].lin=i;
drag[drdr].col=j;
distdr[i][j]=0;
mat[i][j]=1;
}
else if(c=='I'){
start.lin=i;
start.col=j;
mat[i][j]=0;
}
else if(c=='O'){
finish.lin=i;
finish.col=j;
mat[i][j]=0;
}
else if(c=='*'){
mat[i][j]=1;
}
else{
mat[i][j]=0;
}
}
fgetc(fin);
}
bordam(mat,n,m);
poz a,b;
while(stdr<=drdr){
a=drag[stdr++];
for(i=0;i<4;i++){
b.lin=a.lin+dl[i];
b.col=a.col+dc[i];
if(verifpozmat(b.lin,b.col) && mat[b.lin][b.col]==0 && distdr[b.lin][b.col]==NEFOL){
distdr[b.lin][b.col]=distdr[a.lin][a.col]+1;
drag[++drdr]=b;
}
}
}
int rez;
rez=cautbin();
if(rez==0){
fprintf(fout,"-1");
return 0;
}
fprintf(fout,"%d",rez);
return 0;
}