Pagini recente » Cod sursa (job #205470) | Cod sursa (job #395866) | Cod sursa (job #441175) | Cod sursa (job #2024120) | Cod sursa (job #2544853)
#include <iostream>
#include <fstream>
#include <deque>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int a[1005][1005], b[1005][1005], i, j, n, m, ls, cs, lf, cf, x[4]={0, 1, 0, -1}, y[4]={1, 0, -1, 0};
char ch;
deque <int> dx;
deque <int> dy;
void sett()
{
int i;
for(i=0; i<=n+1; i++)
{
a[i][0]=a[i][m+1]=-1;
b[i][0]=b[i][m+1]=-1;
}
for(i=0; i<=m+1; i++)
{
a[0][i]=a[n+1][i]=-1;
b[0][i]=b[n+1][i]=-1;
}
}
void lee1()
{
int l, c;
while(!dx.empty())
{
l=dx.front();
c=dy.front();
for(i=0; i<4; i++)
if(a[l+x[i]][c+y[i]]==0 || a[l+x[i]][c+y[i]]>a[l][c]+1)
{
a[l+x[i]][c+y[i]]=a[l][c]+1;
dx.push_back(l+x[i]);
dy.push_back(c+y[i]);
}
dx.pop_front();
dy.pop_front();
}
}
void lee()
{
int l, c, i, maxx;
dx.push_back(ls);
dy.push_back(cs);
while(!dx.empty())
{
l=dx.front();
c=dy.front();
for(i=0; i<4; i++)
{
maxx=min(b[l][c], a[l+x[i]][c+y[i]]);
if(b[l+x[i]][c+y[i]]==0 || b[l+x[i]][c+y[i]]>maxx)
{
b[l+x[i]][c+y[i]]=maxx;
dx.push_back(l+x[i]);
dy.push_back(c+y[i]);
}
}
dx.pop_front();
dy.pop_front();
}
}
int main()
{
fin >> n >> m;
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
{
fin >> ch;
if(ch=='D')
{
a[i][j]=1;
b[i][j]=-1;
dx.push_back(i);
dy.push_back(j);
}
if(ch=='*')
{
a[i][j]=-1;
b[i][j]=-1;
}
if(ch=='I')
{
ls=i;
cs=j;
}
if(ch=='O')
{
lf=i;
cf=j;
}
}
sett();
lee1();
// for(i=1; i<=n; i++)
// {
// for(j=1; j<=m; j++)
// fout << a[i][j] << " ";
// fout << "\n";
// }
b[ls][cs]=a[ls][cs];
lee();
fout << b[lf][cf];
return 0;
}