Pagini recente » Cod sursa (job #1402715) | Cod sursa (job #1985455) | Cod sursa (job #2491342) | Cod sursa (job #687678) | Cod sursa (job #2888001)
#include <bits/stdc++.h>
#define ll long long
#define INF 0x3F3F3F3F
using namespace std;
const string fisier = "barbar";
ifstream fin (fisier + ".in");
ofstream fout (fisier + ".out");
const int dx[] = {-1 , 1 , 0 , 0},
dy[] = {0 , 0 , -1 , 1};
const int N_MAX = 1e3 + 5;
char ch;
int used[N_MAX][N_MAX] , a[N_MAX][N_MAX] , n , m , ist , jst , ifn , jfn;
vector<pair<int , int>>blocked , dragon;
inline bool inside (int x , int y){
return (x > 0 && y > 0 && x <= n && y <= m);
}
bool solve(int x){
memset(used , 0 , sizeof(used));
memset(a , 0 , sizeof(a));
queue<pair<int , int>>q;
for (auto i : dragon){
q.push({i.first , i.second});
used[i.first][i.second] = 1;
}
while (q.empty() == false){
int i = q.front().first , j = q.front().second;
for (int k=0; k<4; k++){
int iv = i + dx[k] , jv = j + dy[k];
if (inside(iv , jv) && used[iv][jv] == 0 && used[i][j] + 1 <= x){
used[iv][jv] = used[i][j] + 1;
q.push(make_pair(iv , jv));
}
}
q.pop();
}
for (auto i : blocked){
used[i.first][i.second] = 1;
}
q.push({ist , jst});
a[ist][jst] = 1;
while (!q.empty()){
int i = q.front().first , j = q.front().second;
for (int k=0; k<4; k++){
int iv = i + dx[k] , jv = j + dy[k];
if (inside(iv , jv) && used[iv][jv] == 0 && a[iv][jv] == 0){
q.push(make_pair(iv , jv));
a[iv][jv] = a[i][j] + 1;
}
}
q.pop();
}
return a[ifn][jfn];
}
int solve (){
int st = 1 , dr = 1000 , ans = 0;
while (st <= dr){
int mij = (st + dr) / 2;
if (solve(mij)){
ans = max(ans , mij);
st = mij + 1;
}
else{
dr = mij - 1;
}
}
return ans;
}
int main(){
ios_base::sync_with_stdio(false);
fin >> n >> m;
for (int i=1; i<=n; i++){
for (int j=1; j<=m; j++){
fin >> ch;
if (ch == 'D'){
dragon.push_back({i , j});
}
else if (ch == 'O'){
ifn = i , jfn = j;
}
else if (ch == 'I'){
ist = i , jst = j;
}
else if (ch == '*'){
blocked.push_back({i , j});
}
}
}
fout << solve();
}