Pagini recente » Cod sursa (job #2078806) | Cod sursa (job #1792083) | Cod sursa (job #1883576) | Cod sursa (job #1681414) | Cod sursa (job #2295792)
#include <iostream>
#include <fstream>
#include <queue>
#include <string>
#define N 1010
#define f first
#define s second
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int a[N][N],i,j,n,m,dp[N][N];
int dx[4] = {0,0,-1,1};
int dy[4] = {-1,1,0,0};
queue<pair<int,int> >q;
inline bool valid(int x,int y)
{
if(x < 0 || y < 0) return false;
if(x > n || y > m) return false;
return true;
}
int main()
{
int xs,ys,xf,yf,d,x,y,val;
string S;
fin >> n >> m;
for (i = 0; i < n; ++i)
{
fin >> S;
for (j = 0; j < m; ++j)
{
switch(S[j])
{
case 'D':
{
q.push(make_pair(i,j));
a[i][j] = 1;
break;
}
case '*':
{
a[i][j] = -1;
break;
}
case 'I':
{
xs = i;
ys = j;
a[i][j] = 0;
break;
}
case 'O':
{
xf = i;
yf = j;
a[i][j] = 0;
break;
}
case '.':
{
a[i][j] = 0;
break;
}
}
}
}
while(!q.empty())
{
i = q.front().f;
j = q.front().s;
q.pop();
for(d = 0; d < 4; ++d)
{
x = i + dx[d];
y = j + dy[d];
if ( valid(x,y) && !a[x][y])
{
a[x][y] = a[i][j] + 1;
q.push(make_pair(x,y));
}
}
}
dp[xs][ys] = a[xs][ys];
q.push(make_pair(xs,ys));
while(!q.empty())
{
i = q.front().f;
j = q.front().s;
q.pop();
for(d = 0; d < 4; ++d)
{
x = i + dx[d];
y = j + dy[d];
val = min(a[x][y],dp[i][j]);
if ( valid(x,y) && val > dp[x][y])
{
dp[x][y] = val;
q.push(make_pair(x,y));
}
}
}
fout << -1;
return 0;
}