Pagini recente » Cod sursa (job #2817848) | Cod sursa (job #155248) | Cod sursa (job #429938) | Cod sursa (job #1272036) | Cod sursa (job #1145279)
#include <iostream>
#include <fstream>
#include <deque>
using namespace std;
#define MAX 1002
ifstream fin("barbar.in");
ofstream fout("barbar.out");
deque < pair < int , int > > q;
int a[MAX][MAX],b[MAX][MAX];
char c[MAX];
int d[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int main()
{
int n,m,i,j,x1,x2,y1,y2, ni, nj;
char x;
fin>>n>>m;
fin.get();
for(i=1;i<=n;i++)
{
fin.getline(c, MAX);
for(j=0;j<m;j++){
x=c[j];
if(x=='.')
a[i][j+1]=0;
if(x=='D'){
a[i][j+1]=1;
q.push_back(make_pair(i,j+1));
}
if(x=='I'){
x1=i;
y1=j+1;
}
if(x=='O'){
x2=i;
y2=j+1;
}
if(x=='*')
a[i][j+1]=-1;
}
}
for(i=0;i<=n;i++)
a[i][0]=a[i][m+1]=b[i][0]=b[i][m+1]=-1;
for(i=0;i<=m;i++)
a[0][i]=a[n+1][i]=b[0][i]=b[n+1][i]=-1;
while(!q.empty())
{
i=q.front().first;
j=q.front().second;
q.pop_front();
if(!a[i-1][j] && (!b[i-1][j])){
q.push_back(make_pair(i-1,j));
a[i-1][j]=a[i][j]+1;
}
if(!a[i+1][j]&&(!b[i+1][j])){
q.push_back(make_pair(i+1,j));
a[i+1][j]=a[i][j]+1;
}
if(!a[i][j-1]&&(!b[i][j-1])){
q.push_back(make_pair(i,j-1));
a[i][j-1]=a[i][j]+1;
}
if(!a[i][j+1]&&(!b[i][j+1])){
q.push_back(make_pair(i,j+1));
a[i][j+1]=a[i][j]+1;
}
}
b[x1][y1]=a[x1][y1];
q.push_front(make_pair(x1,y1));
while(!q.empty())
{
i=q.front().first;
j=q.front().second;
q.pop_front();
for(x=0;x<4;x++)
{
ni=i+d[x][0];
nj=j+d[x][1];
if(a[ni][nj]>=0 && !b[ni][nj])
{
if(a[ni][nj]>=b[i][j]){
b[ni][nj]=b[i][j];
q.push_front(make_pair(ni,nj));
}
else{
b[ni][nj]=a[ni][nj];
q.push_back(make_pair(ni,nj));
}
}
}
}
fout<<b[x2][y2]-1<<endl;
cout<<(sizeof(a)+sizeof(b))/1024;
return 0;
}