Pagini recente » Cod sursa (job #2455252) | Cod sursa (job #2801531) | Cod sursa (job #2261071) | Cod sursa (job #2561849) | Cod sursa (job #2492051)
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n,m,startx,starty,stopx,stopy;
int D[1005][1005],sol[1005][1005];
char a[1005][1005];
int dx[] = {0,1,0,-1};
int dy[] = {1,0,-1,0};
int i,j,i_urmator,j_urmator,d;
queue <pair <int,int> > Q;
void Read()
{
int i,j;
char c;
fin>>n>>m;
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
{
fin>>c;
a[i][j] = c;
if(c=='D')
Q.push(make_pair(i,j));
else if(c=='I')
{
startx = i;
starty = j;
}
else if(c=='O')
{
stopx = i;
stopy = j;
}
}
}
bool OK(int i, int j)
{
if(i>n || j>m || i<1 || j<1)
return false;
return true;
}
void LeeDragon()
{
while(!Q.empty())
{
i = Q.front().first;
j = Q.front().second;
Q.pop();
for(d=0; d<4; d++)
{
i_urmator= i+dx[d];
j_urmator= j+dy[d];
if(OK(i_urmator,j_urmator) and a[i_urmator][j_urmator]!='D')
{
if(D[i_urmator][j_urmator]==0)
{
Q.push(make_pair(i_urmator,j_urmator));
D[i_urmator][j_urmator] = 1+D[i][j];
}
}
}
}
}
void LeeBarbar()
{
Q.push(make_pair(startx,starty));
sol[startx][starty] = D[startx][starty];
while(!Q.empty())
{
i = Q.front().first;
j = Q.front().second;
Q.pop();
for(d=0; d<4; d++)
{
i_urmator = i+dx[d];
j_urmator = j+dy[d];
if(OK(i_urmator,j_urmator))
{
if(sol[i_urmator][j_urmator]==0 or (sol[i_urmator][j_urmator]< sol[i][j]))
{
Q.push(make_pair(i_urmator,j_urmator));
sol[i_urmator][j_urmator] = min(D[i_urmator][j_urmator],sol[i][j]);
}
}
}
}
fout<<sol[stopx][stopy]<<"\n";
}
int main()
{
Read();
LeeDragon();
LeeBarbar();
return 0;
}