Pagini recente » Cod sursa (job #2279699) | Cod sursa (job #2628940) | Cod sursa (job #2874698) | Cod sursa (job #214565) | Cod sursa (job #1733985)
//Cine a facut sursa e BO$$
//Sursa by Ionut Anghelina
#include<bits/stdc++.h>
using namespace std;
deque<int> q1,q2;
int r,c,xi,yi,xf,yf,a[1005][1005],b[1005][1005],d[5][3],m[1005][1005],x;
char c1,s[1005];
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d%d",&r,&c);
for(int i=1;i<=r;i++)
{
scanf("\n");
scanf("%s",&s);
for(int j=0;j<strlen(s);j++)
{
m[i][j+1]=-1;
if (s[j]=='.')
{
b[i][j+1]=INT_MAX;
}
else
if (s[j]=='I')
{
xi=i;
yi=j+1;
b[i][j+1]=INT_MAX;
}
else
if (s[j]=='O')
{
xf=i;
yf=j+1;
b[i][j+1]=INT_MAX;
}
else
if (s[j]=='D')
{
a[i][j+1]=-1;
b[i][j+1]=0;
q1.push_front(i);
q2.push_front(j+1);
}
else
{
a[i][j]=-1;
b[i][j]=-1;
}
}
}
/* for(int i=1;i<=r;i++)
{
scanf("\n");
for(int j=1;j<=c;j++)
{
m[i][j]=-1;
scanf("%c",&c1);
if (c1=='.')
{
b[i][j]=INT_MAX;
}
else
if (c1=='I')
{
xi=i;
yi=j;
b[i][j]=INT_MAX;
}
else
if (c1=='O')
{
xf=i;
yf=j;
b[i][j]=INT_MAX;
}
else
if (c1=='D')
{
a[i][j]=-1;
b[i][j]=0;
q1.push_front(i);
q2.push_front(j);
}
else
{
a[i][j]=-1;
b[i][j]=-1;
}
}
}*/
d[1][1]=-1;
d[1][2]=0;
d[2][1]=1;
d[2][2]=0;
d[3][1]=0;
d[3][2]=-1;
d[4][1]=0;
d[4][2]=1;
for(int i=0;i<=(c+1);i++)
{
a[0][i]=a[r+1][i]=-2;
}
for(int i=0;i<=(r+1);i++)
{
a[i][0]=a[i][c+1]=-2;
}
while (!q1.empty())
{
for(int i=1;i<=4;i++)
{
{
if (a[q1.front()+d[i][1]][q2.front()+d[i][2]]>=0)
{
if (b[q1.front()+d[i][1]][q2.front()+d[i][2]]>(b[q1.front()][q2.front()]+1))
{
b[q1.front()+d[i][1]][q2.front()+d[i][2]]=b[q1.front()][q2.front()]+1;
q1.push_back(q1.front()+d[i][1]);
q2.push_back(q2.front()+d[i][2]);
}
}
}
}
q1.pop_front();
q2.pop_front();
}
q1.push_front(xi);
q2.push_front(yi);
/* for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)
printf("%d ",b[i][j]);
printf("\n");
}*/
m[xi][yi]=b[xi][yi];
while (!q1.empty())
{
for(int i=1;i<=4;i++)
{
if (a[q1.front()+d[i][1]][q2.front()+d[i][2]]>(-1))
{
x=min(b[q1.front()+d[i][1]][q2.front()+d[i][2]],m[q1.front()][q2.front()]);
if(x>m[q1.front()+d[i][1]][q2.front()+d[i][2]])
{
m[q1.front()+d[i][1]][q2.front()+d[i][2]]=x;
q1.push_back(q1.front()+d[i][1]);
q2.push_back(q2.front()+d[i][2]);
}
}
}
q1.pop_front();
q2.pop_front();
}
printf("%d\n",m[xf][yf]);
return 0;
}