Pagini recente » Cod sursa (job #80628) | Cod sursa (job #2622350) | Cod sursa (job #2409529) | Cod sursa (job #1173101) | Cod sursa (job #3222559)
#include <bits/stdc++.h>
using namespace std;
struct coord{
int lin, col;
};
int dir[4][2] = { { -1, 0 }, { 0, 1 }, { 1, 0 }, { 0, -1 } }, s1, s2, e1, e2, n, m;
bool drum( int v[1005][1005], int d ){
int i, lin, col, l, c;
bool gasit = false;
queue <coord> q;
q.push( { s1, s2 } );
while( q.empty() == false && gasit == false ){
lin = q.front().lin;
col = q.front().col;
for( i = 0; i < 4; i++ ){
l = lin + dir[i][0];
c = col + dir[i][1];
if( 0 <= l && l < n && 0 <= c && c < m && v[l][c] >= d ){
if( l == e1 && c == e2 ){
gasit = true;
}
else{
v[l][c] = -2;
q.push( { l, c } );
}
}
}
}
return gasit;
}
int main(){
int v[1005][1005], i, j, lin, col, l, c, stanga, dreapta, mijloc;
char ch;
ifstream fin( "barbar.in" );
ofstream fout( "barbar.out" );
fin >> n >> m;
///cout << 'I';
queue <coord> q;
s1 = s2 = e1 = e2 = -1;
for( i = 0; i < n; i++ ){
for( j = 0; j < m; j++ ){
fin >> ch;
if( ch == 'I' ){
s1 = i;
s2 = j;
v[i][j] = -1;
}
else if( ch == 'O' ){
e1 = i;
e2 = j;
v[i][j] = -1;
}
else if( ch == 'D' ){
q.push( { i, j } );
v[i][j] = 0;
}
else if( ch == '*' ){
v[i][j] = -2;
}
else{
v[i][j] = -1;
}
///cout << i << ' ' << j << ' ' << v[i][j] << '\n';
}
}
///cout << v[1][6] << '\n';
while( q.empty() == false ){
lin = q.front().lin;
col = q.front().col;
///cout << lin << ' ' << col << '\n';
q.pop();
for( i = 0; i < 4; i++ ){
l = lin + dir[i][0];
c = col + dir[i][1];
///cout << l << ' ' << c << '\n';
if( 0 <= l && l < n && 0 <= c && c < m && ( v[l][c] == -1 || v[l][c] > v[lin][col] + 1 ) ){
v[l][c] = v[lin][col] + 1;
///cout << l << ' ' << c << ' ' << v[l][c] << '\n';
q.push( { l, c } );
}
}
}
stanga = -1;
dreapta = n * m;
while( dreapta - stanga > 1 ){
mijloc = ( stanga + dreapta ) / 2;
if( drum( v, mijloc ) == true ){
dreapta = mijloc;
}
else{
stanga = mijloc;
}
}
fout << dreapta;
return 0;
}