Pagini recente » Cod sursa (job #472889) | Cod sursa (job #2692719) | Cod sursa (job #111000) | Cod sursa (job #1438797) | Cod sursa (job #2161239)
#include <bits/stdc++.h>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
queue<pair<int,int>> d;
int n,a[1005][1005],m,xs,ys,xf,yf,p,b[1005][1005];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int main() {
int i,j,x,y;
char c;
f>>n>>m;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++) {
f>>c;
if (c=='I') {
xs=i;
ys=j;
}
else if (c=='O') {
xf=i;
yf=j;
}
else if (c=='*') a[i][j]=b[i][j]=-1;
else if (c=='D') {
a[i][j]=1;
d.push(make_pair(i,j));
}
}
while(!d.empty()) {
x=d.front().first;
y=d.front().second;
d.pop();
for (i=0;i<4;i++)
if (x+dx[i]>=1 && x+dx[i]<=n && y+dy[i]>=1 && y+dy[i]<=m && a[x+dx[i]][y+dy[i]]==0) {
a[x+dx[i]][y+dy[i]]=a[x][y]+1;
//cout<<x+dx[i]<<' '<<y+dy[i]<<'\n';
d.push(make_pair(x+dx[i],y+dy[i]));
}
}/*
for (i=1;i<=n;i++) {
for (j=1;j<=m;j++)
cout<<a[i][j]<<' ';
cout<<'\n';
}
cout<<'\n';*/
d.push(make_pair(xs,ys));
b[xs][ys]=a[xs][ys];
while (!d.empty()) {
x=d.front().first;
y=d.front().second;
d.pop();
for (i=0;i<4;i++)
if (x+dx[i]>=1 && x+dx[i]<=n && y+dy[i]>=1 && y+dy[i]<=m && b[x+dx[i]][y+dy[i]]!=-1
&& b[x+dx[i]][y+dy[i]]<min(b[x][y],a[x+dx[i]][y+dy[i]])) {
b[x+dx[i]][y+dy[i]]=min(b[x][y],a[x+dx[i]][y+dy[i]]);
d.push(make_pair(x+dx[i],y+dy[i]));
}
}/*
for (i=1;i<=n;i++) {
for (j=1;j<=m;j++)
cout<<b[i][j]<<' ';
cout<<'\n';
}*/
if (b[xf][yf]) g<<b[xf][yf]-1;
else g<<"-1";
return 0;
}