Pagini recente » Cod sursa (job #1608336) | Cod sursa (job #2848478) | Cod sursa (job #1828575) | Cod sursa (job #671621) | Cod sursa (job #1460577)
#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};
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 Lee_Dragon()
{
int i,j,i_next,j_next,dir;
while(!Q.empty())
{
i = Q.front().first;
j = Q.front().second;
Q.pop();
for(dir = 0; dir < 4; dir++)
{
i_next = i+dx[dir];
j_next = j+dy[dir];
if(OK(i_next,j_next) && a[i_next][j_next]!='D')
{
if(d[i_next][j_next]==0 || d[i_next][j_next] > 1+d[i][j])
{
Q.push(make_pair(i_next,j_next));
d[i_next][j_next] = 1+d[i][j];
}
}
}
}
}
void Lee_Paftenie()
{
int i,j,i_next,j_next,dir;
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(dir = 0; dir < 4; dir++)
{
i_next = i+dx[dir];
j_next = j+dy[dir];
if(OK(i_next,j_next))
{
if(sol[i_next][j_next]==0 || (sol[i_next][j_next]< sol[i][j]))
{
Q.push(make_pair(i_next,j_next));
sol[i_next][j_next] = min(d[i_next][j_next],sol[i][j]);
}
}
}
}
fout<<sol[stopx][stopy]<<"\n";
}
int main()
{
Read();
Lee_Dragon();
Lee_Paftenie();
fout.close();
return 0;
}