Pagini recente » Cod sursa (job #1794781) | Cod sursa (job #2206707) | Cod sursa (job #18024) | Cod sursa (job #2888683) | Cod sursa (job #2641451)
#include <iostream>
#include <fstream>
#include <vector>
#define DIM 1005
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
struct punct{
short ox, oy;
}coada[DIM*DIM],pp,ps;
vector <punct> dragon;
short R,C, dmin[DIM][DIM];
bool a[DIM][DIM], copie[DIM][DIM];
const int kx[] = {-1,0,1,0};
const int ky[] = {0,1,0,-1};
void initializare(short a[][DIM], int n, int m){
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
a[i][j] = 2*DIM;
}
void bordare(bool a[][DIM], int n, int m){
for(int i=0; i<=m+1; i++)
a[0][i] = a[n+1][i] = 1;
for(int i=0; i<=n+1; i++)
a[i][0] = a[i][m+1] = 1;
}
void copiere_matrice(int n, int m, bool a[][DIM], bool copie[][DIM]){
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
a[i][j] = copie[i][j];
}
void Dragon_Blast(int i, int j){
dmin[i][j] = 0;
int inc=0,sf=0;
coada[inc].ox = i, coada[inc].oy = j;
while(inc <=sf){
punct p = coada[inc];
for(int i=0; i<4; i++)
if(dmin[p.ox + kx[i]][p.oy + ky[i]] > dmin[p.ox][p.oy] + 1){
dmin[p.ox + kx[i]][p.oy + ky[i]] = dmin[p.ox][p.oy] + 1;
coada[++sf].ox = p.ox + kx[i];
coada[sf].oy = p.oy + ky[i];
}
inc++;
}
}
void citire(short n, short m, bool a[][DIM]){
bordare(a,n,m);
char c;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++){
f>>c;
if(c == '.')
a[i][j] = 0;
if(c == '*'){
a[i][j] = 1;
dmin[i][j] = 0;
}
if(c == 'I')
pp.ox = i, pp.oy=j;
if(c == 'O')
ps.ox = i, ps.oy =j;
if(c == 'D'){
punct d; d.ox = i, d.oy = j;
a[i][j] = 1;
dragon.push_back(d);
}
}
for(int i=0; i<dragon.size(); i++)
Dragon_Blast(dragon[i].ox, dragon[i].oy);
for(int i=0; i<dragon.size(); i++)
cout<<dragon[i].ox<<" "<<dragon[i].oy<<"\n";
copiere_matrice(n,m,copie,a);
}
bool Lee(bool a[][DIM],int sup){
int inc=0, sf=0;
coada[inc] = pp;
a[pp.ox][pp.oy] = 1;
while(inc <= sf && a[ps.ox][ps.oy] == 0){
punct p = coada[inc];
for(int i=0; i<4; i++)
if(a[p.ox + kx[i]][p.oy + ky[i]] == 0 && dmin[p.ox + kx[i]][p.oy + ky[i]] >= sup){
a[p.ox + kx[i]][p.oy + ky[i]] = 1;
coada[++sf].ox = p.ox + kx[i];
coada[sf].oy = p.oy + ky[i];
}
inc++;
}
return a[ps.ox][ps.oy];
}
void solve(){
int rez=-1;
int st = 1, dr = R+C;
while(st <= dr){
int mij = (st + dr)/2;
if(Lee(a,mij) == 1){
rez = mij;
st = mij+1;
}
else
dr = mij-1;
copiere_matrice(R,C,a,copie);
}
g<<rez;
}
int main()
{
f>>R>>C;
initializare(dmin,R,C);
citire(R,C,a);
dmin[ps.ox][ps.oy] = R+C;
solve();
}