Pagini recente » Cod sursa (job #303996) | Cod sursa (job #1540017) | Cod sursa (job #441922) | Cod sursa (job #2765596) | Cod sursa (job #1555073)
#include <cstdio>
#include <queue>
using namespace std;
const int inf = (1 << 29) - 1;
char harta[1001][1001];
bool obst[1001][1001];
int best[1001][1001];
int n, m;
int di[4] = {-1, 0, 1, 0};
int dj[4] = {0, 1, 0, -1};
int stx, sty,
fnx, fny;
bool okd(int ii, int jj){
if(ii >= 1 && ii <= n && jj >= 1 && jj <= m){
if(harta[ii][jj] == '.' || harta [ii][jj] == 'I'){
return true;
}
return false;
}
return false;
}
int dragon[1001][1001];
int dist(){
queue < pair<int, int> > qd;
for(int i = 1;i <= n;i++){
for(int j = 1;j <= m;j++){
if(harta[i][j] == 'D'){
dragon[i][j] = 0;
qd.push(make_pair(i, j));
}
else{
dragon[i][j] = inf;
}
}
}
while(!qd.empty()){
pair <int, int> cel = qd.front();
qd.pop();
for(int d = 0;d < 4;d++){
int ii = cel.first + di[d];
int jj = cel.second + dj[d];
if(okd(ii, jj)){
int celula = dragon[cel.first][cel.second] + 1;
if(celula < dragon[ii][jj]){
qd.push(make_pair(ii, jj));
dragon[ii][jj] = celula;
}
}
}
}
}
bool ok(int ii, int jj, int D){
if(ii >= 1 && ii <= n && jj >= 1 && jj <= m){
if(harta[ii][jj] == '.' || harta[ii][jj] == 'O'){
if(dragon[ii][jj] < D){
return false;
}
return true;
}
return false;
}
return false;
}
bool lee(int D){
queue < pair<int, int> > q;
for(int i = 1;i <= n;i++){
for(int j = 1;j <= m;j++){
best[i][j] = inf;
}
}
best[stx][sty] = 0;
if((dragon[stx][sty] >= D)){
q.push(make_pair(stx, sty));
}
while(!q.empty()){
pair <int, int> cel = q.front();
q.pop();
for(int d = 0;d < 4;d++){
int ii = cel.first + di[d];
int jj = cel.second + dj[d];
if(ok(ii, jj, D)){
int pas = best[cel.first][cel.second] + 1;
if(pas < best[ii][jj]){
q.push(make_pair(ii, jj));
best[ii][jj] = pas;
}
}
}
}
if(best[fnx][fny] < inf){
return true;
}
else{
return false;
}
}
int sarci(int st, int dr, int last){
if(st > dr){
return last;
}
int mij = (st + dr) / 2;
if(lee(mij)){
st = mij + 1;
last = mij;
}
else{
dr = mij - 1;
}
return sarci(st, dr, last);
}
int main()
{
FILE *fin, *fout;
fin = fopen("barbar.in","r");
fout = fopen("barbar.out","w");
int i, j;
fscanf(fin,"%d%d\n",&n,&m);
for(i = 1;i <= n;i++){
for(j = 1;j <= m;j++){
fscanf(fin,"%c\n",&harta[i][j]);
if(harta[i][j] == 'I'){
stx = i;
sty = j;
}
if(harta[i][j] == 'O'){
fnx = i;
fny = j;
}
}
}
dist();
fprintf(fout,"%d\n",sarci(1, (n * m) + 1, -1));
return 0;
}