Pagini recente » Cod sursa (job #2728749) | Cod sursa (job #99285) | Cod sursa (job #1101521) | Cod sursa (job #1344178) | Cod sursa (job #2671636)
#include <iostream>
#include <fstream>
#include <deque>
using namespace std;
#define NMAX 1005
ifstream f("barbar.in");
ofstream g("barbar.out");
int a[NMAX][NMAX], b[NMAX][NMAX];
int i, j, n, m, startx, starty, finx, finy;
int di[]={0, 1, 0, -1}, dj[]={1, 0, -1, 0};
char ch;
deque <int> dx;
deque <int> dy;
void lee1()
{
int i, j, k;
while(!dx.empty())
{
i = dx.front();
j = dy.front();
for(k = 0; k < 4; k ++)
if(a[i + di[k]][j + dj[k]] ==0 or a[i + di[k]][j + dj[k]] > a[i][j] + 1)
{
a[i + di[k]][j + dj[k]] = a[i][j] + 1;
dx.push_back(i + di[k]);
dy.push_back(j + dj[k]);
}
dx.pop_front();
dy.pop_front();
}
}
void lee()
{
int i, j, k, maxi;
dx.push_back(startx);
dy.push_back(starty);
while(!dx.empty())
{
i = dx.front();
j = dy.front();
for(k = 0; k < 4; k ++)
{
maxi = min(b[i][j], a[i + di[k]][j + dj[k]]);
if(b[i + di[k]][j + dj[k]] != -1 and b[i + di[k]][j + dj[k]] < maxi)
{
b[i + di[k]][j + dj[k]] = maxi;
dx.push_back(i + di[k]);
dy.push_back(j + dj[k]);
}
}
dx.pop_front();
dy.pop_front();
}
}
int main()
{
f >> n >> m;
for(i = 1; i <= n; i ++)
for(j = 1; j <= m; j ++)
{
f >> ch;
if(ch == 'D')
{
a[i][j] = 1;
dx.push_back(i);
dy.push_back(j);
}
if(ch == '*')
{
a[i][j] = -1;
b[i][j] = -1;
}
if(ch == 'I')
{
startx = i;
starty = j;
}
if(ch=='O')
{
finx = i;
finy = j;
}
}
for(i = 0; i <= n + 1; i ++)
{
a[i][0] = a[i][m + 1] = -1;
b[i][0] = b[i][m + 1] = -1;
}
for(i = 0; i <= m + 1; i ++)
{
a[0][i] = a[n + 1][i] = -1;
b[0][i] = b[n + 1][i] = -1;
}
lee1();
b[startx][starty] = a[startx][starty];
lee();
g << b[finx][finy] - 1;
return 0;
}