Pagini recente » Cod sursa (job #2218568) | Cod sursa (job #1776692) | Cod sursa (job #3122731) | Cod sursa (job #2285136) | Cod sursa (job #1856906)
#include <fstream>
#include <queue>
#include <iomanip>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
struct coord
{
int x,y;
}a;
int m,n,mat[1002][1002],startx,starty;
int di[4]={0,0,-1,1};
int dj[4]={-1,1,0,0};
queue <coord> coada;
void Read()
{
fin>>m>>n;
char c;
for (int i=0;i<=m+1;i++)
for (int j=0;j<=n+1;j++) {
if (i==0 || j==0 || i==m+1 || j==n+1) mat[i][j]=-5;
else {
fin>>c;
if (c=='D') {
mat[i][j]=-3;
a.x=i;
a.y=j;
coada.push(a);
}
else if (c=='O') mat[i][j]=-1;
else if (c=='*') mat[i][j]=-2;
else if (c=='I') {
startx=i;
starty=j;
}
}
}
}
void Lee()
{
int i,j,i_urm,j_urm,ok;
while (!coada.empty()) {
ok=0;
i=coada.front().x;
j=coada.front().y;
if (mat[i][j]==-3) {mat[i][j]=0;ok=1;}
for (int x=0;x<4;x++) {
i_urm=i+di[x];
j_urm=j+dj[x];
if (mat[i_urm][j_urm]==0 && i_urm>0 && j_urm>0 && i_urm<m+1 && j_urm<n+1) {
mat[i_urm][j_urm]=mat[i][j]+1;
a.x=i_urm;
a.y=j_urm;
coada.push(a);
}
}
if (ok) mat[i][j]=-3;
coada.pop();
}
}
int fill(int i,int j,int k,int i_ant,int j_ant)
{
if (mat[i][j]==-1) return 1;
if (mat[i][j]==-3) return 0;
if (j-1>0 && i-1>0 && j+1<n+1 && i+1<m+1 && i_ant!=i && j_ant!=j) {
if (mat[i+1][j]<=k) fill(i+1,j,k,i,j);
if (mat[i-1][j]<=k) fill(i-1,j,k,i,j);
if (mat[i][j+1]<=k) fill(i,j+1,k,i,j);
if (mat[i][j-1]<=k) fill(i,j-1,k,i,j);
}
}
int cautare_binara()
{
int pas=1<<11,i=1<<12;
while (pas!=0) {
if (fill(startx,starty,i-pas,startx,starty)) i-=pas;
pas/=2;
}
return i;
}
int main()
{
Read();
Lee();
fout<<cautare_binara()+1;
}