Pagini recente » Cod sursa (job #2202842) | Cod sursa (job #2435282) | Cod sursa (job #2584262) | Cod sursa (job #133833) | Cod sursa (job #1856967)
#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};
coord redo[180000000];
queue <coord> coada;
int q=0;
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 Lee(int k)
{
int i,j,i_urm,j_urm;
i=startx;
j=starty;
for (int x=0;x<4;x++) {
i_urm=i+di[x];
j_urm=j+dj[x];
if (mat[i_urm][j_urm]>=k && i_urm>0 && j_urm>0 && i_urm<m+1 && j_urm<n+1) {
redo[q++]=a;
mat[i_urm][j_urm]=-mat[i_urm][j_urm];
a.x=i_urm;
a.y=j_urm;
coada.push(a);
}
}
while (!coada.empty()) {
i=coada.front().x;
j=coada.front().y;
for (int x=0;x<4;x++) {
i_urm=i+di[x];
j_urm=j+dj[x];
if (mat[i_urm][j_urm]>=k && i_urm>0 && j_urm>0 && i_urm<m+1 && j_urm<n+1) {
mat[i_urm][j_urm]=-mat[i_urm][j_urm];
redo[q++]=a;
a.x=i_urm;
a.y=j_urm;
coada.push(a);
}
if (mat[i_urm][j_urm]==-1) return 1;
}
coada.pop();
}
return 0;
}
void refa()
{
for (int i=0;i<q;i++) mat[redo[i].x][redo[i].y]=-mat[redo[i].x][redo[i].y];
}
int cautare_binara()
{
int pas=1<<30,i=0;
while (pas!=0) {
q=0;
if (Lee(pas)) i+=pas;
pas/=2;
}
return i;
}
int main()
{
Read();
Lee();
fout<<cautare_binara()-1;
}