Pagini recente » Cod sursa (job #3253541) | Cod sursa (job #2973936) | Cod sursa (job #1732665) | Cod sursa (job #2734569) | Cod sursa (job #2205831)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int N=1005;
struct punct{
int lin,col;
};
int viz[N][N];
int n,m,flacari[N][N],start_x,start_y,fin_x,fin_y;
char harta[N][N];
vector<punct> dragoni;
int modul(int n)
{
if(n>0)
return n;
return -n;
}
void marcheaza(int d)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
bool ok=false;
for(auto &k :dragoni)
{
int dct=modul(k.lin-i)+modul(k.col-j)+1;
if(dct<=d)
ok=true;
}
if(ok){
flacari[i][j] = d;
}
}
}
int addx[] = {0, 1, 0, -1};
int addy[] = {-1, 0, 1, 0};
bool point_is_inside(int x, int y){
return x>0 && x<=m && y>0 && y<=n;
}
#include<list>
bool poate_ajunge(int raza){
list<punct> q;
punct inceput;
inceput.col = start_x;
inceput.lin = start_y;
q.push_back(inceput);
while(!q.empty()){
punct pct_crt = q.front();
if(pct_crt.lin == fin_y && pct_crt.col == fin_x)
return true;
viz[pct_crt.lin][pct_crt.col] = raza;
//cout<<pct_crt.lin<<" "<<pct_crt.col<<"\n";
for(int dir=0; dir<4; ++dir){
punct pct_nou;
pct_nou.lin = pct_crt.lin + addy[dir];
pct_nou.col = pct_crt.col + addx[dir];
int i = pct_nou.lin;
int j = pct_nou.col;
if(point_is_inside(pct_nou.col, pct_nou.lin) && viz[i][j] != raza && harta[i][j] != '*' && flacari[i][j] != raza){
q.push_back(pct_nou);
}
}
q.pop_front();
}
return false;
}
int main()
{
int i,j;
fin>>n>>m;
fin.getline(harta[0], N);
for(i=1; i<=n; i++){
fin.getline(harta[i]+1,N);
}
//for(i=1; i<=n; i++) cout<<harta[i]+1<<'\n';
for(int i=1; i<=n; ++i)
for(int j=1; j<=n; ++j)
if(harta[i][j] == 'D')
{
punct p;
p.lin = i;
p.col = j;
dragoni.push_back(p);
}
else if(harta[i][j] == 'I'){
start_x = j;
start_y = i;
}
else if(harta[i][j] == 'O'){
fin_x = j;
fin_y = i;
}
//for(auto &x : dragoni) cout<<x.lin<<", "<<x.col<<"\n";
/* for(int i=1; i<=n; ++i){
for(int j=1; j<=m; ++j)
cout<<flacari[i][j]<<" ";
cout<<"\n";
}*/
for(i=n*2; i>=1; --i)
{
marcheaza(i);
//cout<<"Poate ajunge (raza = "<<i<<"): "<<poate_ajunge(i)<<"\n";
if(poate_ajunge(i) == 1)
break;
}
//cout<<"i ="<<i;
if(i > 0)
fout<<i;
else
fout<<"-1";
}