Pagini recente » Cod sursa (job #2320043) | Cod sursa (job #829271) | Cod sursa (job #2289131) | Cod sursa (job #1954159) | Cod sursa (job #2158667)
#include <bits/stdc++.h>
using namespace std;
#define f first
#define s second
#define mp make_pair
#define ll long long
class InParser {
private:
FILE *fin;
char *buff;
int sp;
char read_ch() {
++sp;
if (sp == 4096) {
sp = 0;
fread(buff, 1, 4096, fin);
}
return buff[sp];
}
public:
InParser(const char* nume) {
fin = fopen(nume, "r");
buff = new char[4096]();
sp = 4095;
}
InParser& operator >> (int &n) {
char c;
while (!isdigit(c = read_ch()) && c != '-');
int sgn = 1;
if (c == '-') {
n = 0;
sgn = -1;
} else {
n = c - '0';
}
while (isdigit(c = read_ch())) {
n = 10 * n + c - '0';
}
n *= sgn;
return *this;
}
InParser& operator >> (long long &n) {
char c;
n = 0;
while (!isdigit(c = read_ch()) && c != '-');
long long sgn = 1;
if (c == '-') {
n = 0;
sgn = -1;
} else {
n = c - '0';
}
while (isdigit(c = read_ch())) {
n = 10 * n + c - '0';
}
n *= sgn;
return *this;
}
InParser& operator >> (char &n) {
char c='\n';
while (c == '\n') c = read_ch();
n=c;
return *this;
}
};
ll a[1010][1010],d[1010][1010],dx[]={0,1,0,-1},dy[]={1,0,-1,0};
queue<pair<ll,ll> >q;
int main()
{
InParser fin("barbar.in");
freopen("barbar.out","w",stdout);
ll n,m,i,j,xo,yo,xd,yd,x,y;
char c;
fin>>n>>m;
for (i=1;i<=n;i++){
for (j=1;j<=m;j++){
fin>>c;
if (c=='I') {xo=i;yo=j;}
if (c=='*') a[i][j]=-1;
if (c=='O') {xd=i;yd=j;}
if (c=='D') {q.push(mp(i,j));d[i][j]=1;}
}
}
for (i=0;i<=n+1;i++) {a[i][0]=-1;a[i][m+1]=-1;}
for (i=0;i<=m+1;i++) {a[0][i]=-1;a[n+1][i]=-1;}
while (!q.empty()){
x=q.front().f;
y=q.front().s;
q.pop();
for (i=0;i<4;i++){
if (a[x+dx[i]][y+dy[i]]!=-1&&d[x+dx[i]][y+dy[i]]==0){
d[x+dx[i]][y+dy[i]]=d[x][y]+1;
q.push(mp(x+dx[i],y+dy[i]));
}
}
}
q.push(mp(xo,yo));
a[xo][yo]=d[xo][yo];
while (!q.empty()){
x=q.front().f;
y=q.front().s;
q.pop();
for (i=0;i<4;i++){
if (a[x+dx[i]][y+dy[i]]!=-1&&a[x+dx[i]][y+dy[i]]<min(d[x+dx[i]][y+dy[i]],a[x][y])){
a[x+dx[i]][y+dy[i]]=min(d[x+dx[i]][y+dy[i]],a[x][y]);
q.push(mp(x+dx[i],y+dy[i]));
}
}
}
printf("%lld",a[xd][yd]-1);
return 0;
}