Pagini recente » Cod sursa (job #698682) | Cod sursa (job #1194664) | Cod sursa (job #2497047) | Cod sursa (job #2074678) | Cod sursa (job #2836128)
#include <iostream>
#include <fstream>
#include <queue>
#define pii pair <int, int>
#define LIBER 0
#define PERETE 1
#define DRAGON 2
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int N = 1000;
int original[N + 1][N + 1], harta[N + 1][N + 1], n, m;
bool reach[N + 1][N + 1];
/// ordine N, E, S, V:
int diri[] = {-1, 0, 1, 0};
int dirj[] = {0, 1, 0, -1};
void clear_harta(){
for(int i = 1; i <= N; i++)
for(int j = 1; j <= N; j++)
reach[i][j] = harta[i][j] = 0;
}
bool in_bounds(int i, int j){
return (1 <= i && i <= n && 1 <= j && j <= m);
}
void my_fill(pii nod){
reach[nod.first][nod.second] = true;
for(int dir = 0; dir < 4; dir++){
if(!reach[nod.first + diri[dir]][nod.second + dirj[dir]] && harta[nod.first + diri[dir]][nod.second + dirj[dir]] == LIBER && in_bounds(nod.first + diri[dir], nod.second + dirj[dir]))
my_fill({nod.first + diri[dir] ,nod.second + dirj[dir]});
}
}
int main(){
pii intrare, iesire;
fin >> n >> m;
char ch;
fin.get(ch); /// '\n'
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
fin.get(ch);
if(ch == 'I') intrare = {i, j};
if(ch == 'O') iesire = {i, j};
if(ch == 'D') original[i][j] = DRAGON;
if(ch == '*') original[i][j] = PERETE;
}
fin.get(ch); /// '\n'
}
int st = 0, dr = N, ans = -1;
while(st <= dr){
clear_harta();
int dist = (st + dr) / 2;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
harta[i][j] = original[i][j];
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
if(original[i][j] == DRAGON){
for(int dir = 0; dir < 4; dir++){
int x = i, y = j;
for(int k = 0; k < dist; k++){
x += diri[dir];
y += dirj[dir];
if(in_bounds(x, y) && original[x][y] == LIBER) harta[x][y] = PERETE;
}
}
}
}
}
my_fill(intrare);
/*cout << ">> " << dist << endl;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++)
cout << harta[i][j] << " ";
cout << endl;
}
cout << endl;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++)
cout << reach[i][j] << " ";
cout << endl;
}**/
if(reach[iesire.first][iesire.second]) ans = dist, st = dist + 1;
else dr = dist - 1;
}
fout << ans + 1;
return 0;
}