Pagini recente » Cod sursa (job #926851) | Cod sursa (job #1246906) | Cod sursa (job #1987049) | Cod sursa (job #831525) | Cod sursa (job #2480730)
#include <bits/stdc++.h>
const int bomba = 1e9 + 6;
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n, m, k, b[1005][1005]; /// b[i][j] dist min de la i j la un dragon
char a[1005][1005];
pair<int, int> v[1000005];
bitset<1003> c[1003];
int xi, yi, xf, yf;
void Read()
{
fin >> n >> m;
for(int i = 1; i <= n; i++)
fin >> (a[i] + 1);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
if(a[i][j] == 'I')
{
xi = i;
yi = j;
}
else if(a[i][j] == 'O')
{
xf = i;
yf = j;
}
}
void Bordare()
{
int i , j;
for(int i = 0; i <= n + 1; i++) ///coloanele 0 si m + 1 bordate
a[i][0] = a[i][m + 1] = '*';
for(int i = 1; i <= m + 1; i++)
a[0][i] = a[m + 1][i] = '*';
}
void Initial()
{
int i , j;
for(i = 1; i <= n; i++)
for(j = 1; j <= m; j++)
if(a[i][j] == 'D')
{
b[i][j] = 0;
k++;
v[k] = {i,j};
}
else b[i][j] = bomba;
}
void Distante()
{
int i , j, x , y;
while(k > 0)
{
i = v[k].first;
j = v[k].second;
k--;
///nord
x = i - 1;
y = j;
if(a[x][y] != '*' && b[x][y] > b[i][j] + 1)
{
b[x][y] = b[i][j] + 1;
k++;
v[k] = {x , y};
}
///sud
x = i + 1;
y = j;
if(a[x][y] != '*' && b[x][y] > b[i][j] + 1)
{
b[x][y] = b[i][j] + 1;
k++;
v[k] = {x , y};
}
///est
x = i;
y = j + 1;
if(a[x][y] != '*' && b[x][y] > b[i][j] + 1)
{
b[x][y] = b[i][j] + 1;
k++;
v[k] = {x , y};
}
///vest
x = i;
y = j - 1;
if(a[x][y] != '*' && b[x][y] > b[i][j] + 1)
{
b[x][y] = b[i][j] + 1;
k++;
v[k] = {x , y};
}
}
}
///verific daca pot ajunge de la i la o mergand doar pe val >= val
void Fill(short i , short j, int val)
{
if(a[i][j] != '*' && b[i][j] >= val && c[i][j] == 0)
{
c[i][j] = 1;
Fill(i - 1, j, val);
Fill(i + 1, j, val);
Fill(i, j + 1, val);
Fill(i, j - 1, val);
}
}
void Rezolva()
{
int Val;
for(Val = b[xi][yi]; Val >= 1; Val--)
{
for(int i = 1; i <= n; i++)
c[i].reset();
Fill(xi,yi,Val);
if(c[xf][yf] == 1)
{
fout << Val << "\n";
fout.close();
return;
}
}
fout <<"-1\n";
fout.close();
}
int main()
{
Read();
Bordare();
Initial();
Distante();
Rezolva();
// for(int i = 0; i <= n + 1; i++, cout << "\n")
// for(int j = 0; j <= m + 1; j++)
// cout << a[i][j];
return 0;
}