Pagini recente » Cod sursa (job #1146374) | Cod sursa (job #534673) | Cod sursa (job #889628) | Cod sursa (job #460613) | Cod sursa (job #2083045)
#include <fstream>
#include<bits/stdc++.h>
#define nmax 1002
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
struct punct
{
int i,j,val;
} P[nmax],start,iesire;
int L,C,n,A[nmax][nmax],vizitati[nmax][nmax];
queue <punct> v;
void Lee(int minim)
{
while(v.size()>0)
{
int i=v.front().i;
int j=v.front().j;
if(vizitati[i+1][j]==0 && A[i+1][j]>=minim)
{
punct vecin;
vecin.i=i+1;
vecin.j=j;
v.push(vecin);
vizitati[i+1][j]=1;
}
if(vizitati[i-1][j]==0 && A[i-1][j]>=minim)
{
punct vecin;
vecin.i=i-1;
vecin.j=j;
v.push(vecin);
vizitati[i-1][j]=1;
}
if(vizitati[i][j+1]==0 && A[i][j+1]>=minim)
{
punct vecin;
vecin.i=i;
vecin.j=j+1;
v.push(vecin);
vizitati[i][j+1]=1;
}
if(vizitati[i][j-1]==0 && A[i][j-1]>=minim)
{
punct vecin;
vecin.i=i;
vecin.j=j-1;
v.push(vecin);
vizitati[i][j-1]=1;
}
v.pop();
}
}
int cautare(int i,int j)
{
if(i>j) return -1;
if(i==j)
{
v.push(start);
for(int i=1; i<=L; ++i)
for(int j=1; j<=C; ++j)
vizitati[i][j]=0;
vizitati[start.i][start.j]=1;
Lee(i);
if(vizitati[iesire.i][iesire.j]==1)
return i;
else return -1;
}
if(j==i+1)
{
v.push(start);
for(int i=1; i<=L; ++i)
for(int j=1; j<=C; ++j)
vizitati[i][j]=0;
vizitati[start.i][start.j]=1;
Lee(j);
if(vizitati[iesire.i][iesire.j]==1)
return j;
if(i!=1)
return i;
return cautare(1,1);
}
if(i<j)
{
int mij=(i+j)/2;
v.push(start);
for(int i=1; i<=L; ++i)
for(int j=1; j<=C; ++j)
vizitati[i][j]=0;
vizitati[start.i][start.j]=1;
Lee(mij);
if(vizitati[iesire.i][iesire.j])
return cautare(mij,j);
else return cautare(i,mij-1);
}
}
int main()
{
///codificari:
/// celula libera . -1
/// perete * -2
/// dragon D 0
/// start I
/// iesire O
f>>L>>C;
for(int i=1; i<=L; ++i)
for(int j=1; j<=C; ++j)
{
char c;
f>>c;
switch (c)
{
case '.':
A[i][j]=-1;
break;
case '*':
A[i][j]=-2;
break;
case 'D':
A[i][j]=0;
punct dragon;
dragon.i=i;
dragon.j=j;
dragon.val=0;
v.push(dragon);
break;
case 'I':
start.i=i;
start.j=j;
A[i][j]=-1;
break;
case 'O':
iesire.i=i;
iesire.j=j;
A[i][j]=-1;
break;
}
}
while(v.size()>0)
{
int i=v.front().i;
int j=v.front().j;
if(A[i+1][j]==-1)
{
punct vecin;
vecin.i=i+1;
vecin.j=j;
A[i+1][j]=vecin.val=A[i][j]+1;
v.push(vecin);
}
if(A[i-1][j]==-1)
{
punct vecin;
vecin.i=i-1;
vecin.j=j;
A[i-1][j]=vecin.val=A[i][j]+1;
v.push(vecin);
}
if(A[i][j+1]==-1)
{
punct vecin;
vecin.i=i;
vecin.j=j+1;
A[i][j+1]=vecin.val=A[i][j]+1;
v.push(vecin);
}
if(A[i][j-1]==-1)
{
punct vecin;
vecin.i=i;
vecin.j=j-1;
A[i][j-1]=vecin.val=A[i][j]+1;
v.push(vecin);
}
v.pop();
}
g<<cautare(1,A[start.i][start.j]);
return 0;
}