Pagini recente » Cod sursa (job #2353734) | Cod sursa (job #2872716) | Cod sursa (job #4272) | Cod sursa (job #1833681) | Cod sursa (job #3150120)
#include <fstream>
#include <queue>
#include <climits>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
const int nmax = 1005;
struct cell {
int lin, col;
};
int r, c;
int dist[nmax][nmax];
bool viz[nmax][nmax];
const int dx[] = {0, 1, 0, -1};
const int dy[] = {1, 0, -1, 0};
bool verificare(int a, int b){
return (a >= 1 && a <= r && b >= 1 && b <= c);
}
int main(){
queue<cell> q;
f >> r >> c;
int start1, start2;
int final1, final2;
for(int i = 1; i <= r; i++){
for(int j = 1; j <= c; j++){
char c;
f >> c;
dist[i][j] = -5;
if(c == '.'){
}
if(c == 'I'){
start1 = i;
start2 = j;
}
if(c == 'D'){
dist[i][j] = 0;
q.push({i, j});
}
if(c == '*'){
dist[i][j] = -1;
}
if(c == 'O'){
final1 = i;
final2 = j;
}
}
}
while(!q.empty()){
cell celula = q.front();
q.pop();
for(int dir = 0; dir < 4; dir++){
int lnou = celula.lin + dx[dir];
int cnou = celula.col + dy[dir];
if(verificare(lnou, cnou) && dist[lnou][cnou] == -5){
q.push({lnou, cnou});
dist[lnou][cnou] = dist[celula.lin][celula.col] + 1;
}
}
}
/* for(int i = 1; i <= r; i++){
for(int j = 1; j <= c; j++){
cout << dist[i][j] << ' ';
}
cout << '\n';}*/
// cout << final1 << ' ' << final2;
int st = 1, dr = r + c;
int sol = -1;
while(st <= dr){
int mid = (st + dr) / 2;
if(dist[start1][start2] < mid){
dr = mid - 1;
continue;
}
queue<cell> qu;
qu.push({start1, start2});
viz[start1][start2] = 1;
bool ok = 0;
while(!qu.empty()){
cell celula = qu.front();
qu.pop();
viz[celula.lin][celula.col] = 1;
for(int dir = 0; dir < 4; dir++){
int lnou = celula.lin + dx[dir];
int cnou = celula.col + dy[dir];
if(verificare(lnou, cnou) && dist[lnou][cnou] >= mid && viz[lnou][cnou] == 0){
qu.push({lnou, cnou});
if(lnou == final1 && cnou == final2){
ok = 1;
break;
}
}
}
if(ok == 1){
break;
}
}
if(ok == 1){
st = mid + 1;
sol = mid;
}
else{
dr = mid - 1;
}
for(int i = 1; i <= r; i++){
for(int j = 1; j <= c; j++){
if(viz[i][j] >= 1){
viz[i][j] = 0;
}
}
}
}
g << sol << '\n';
}