Pagini recente » Cod sursa (job #2115349) | Cod sursa (job #2979308) | Cod sursa (job #2437889) | Cod sursa (job #2585126) | Cod sursa (job #2552959)
/*#include <fstream>
#include <deque>
#define K 1003
#define INF 1000000000
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int f[K][K],b[K][K],i,j,n,m,st,mid,dr,is,js,ifin,jfin,iv,jv;
int di[]={0,1,0,-1};
int dj[]={1,0,-1,0};
char a[K][K];
deque <pair<int,int> > c;
int verif(int x){
///verif daca exista drum in care toti dragonii sa fie la minim x departare
while(!c.empty())
c.pop_front();
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
f[i][j]=0;
if(b[is][js]<x)return 0;
c.push_back({is,js});
f[is][js]=1;
while(!c.empty()){
i=c.front().first;
j=c.front().second;
if(i==ifin && j==jfin) return 1;
c.pop_front();
for(int dir=0;dir<4;dir++){
if(!(iv&&jv&&iv<=n&&jv<=m))continue;
if(a[iv][jv]=='*')continue;
if(!f[iv][jv] && b[iv][jv]>=x){
c.push_back({iv,jv});
f[iv][jv]=1;
}
}
}
return 0;
}
int main(){
fin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++){
fin>>a[i][j];
b[i][j]=INF;
if(a[i][j]=='D'){
c.push_back({i,j});
b[i][j]=0;
}
if(a[i][j]=='I'){
is=i; js=j;
}
if(a[i][j]=='O'){
ifin=i; jfin=j;
}
}
///calculez pt fiecare celula distantele pana la toti dragonii si retin minimul
while(!c.empty()){
i=c.front().first;
j=c.front().second;
c.pop_front();
for(int dir=0;dir<4;dir++){
int iv=i+di[dir];
int jv=j+dj[dir];
if(!(iv&&jv&&iv<=n&&jv<=m))continue;
if(a[iv][jv]=='*')continue;
if(b[iv][jv]==INF){
b[iv][jv]=b[i][j]+1;
c.push_back({iv,jv});
}
}
}
for(i=1;i<=n;i++){
for(j=1;j<=m;j++)
if(b[i][j]==INF)fout<<"-1 ";
else
fout<<" "<<b[i][j]<<" ";
fout<<"\n";
}
///caut binar rezultatul
st=1; dr=2000;
while(st<=dr){
mid=(st+dr)/2;
if(!verif(mid))
dr=mid-1;
else st=mid+1;
}
fout<<verif (0);
return 0;
}*/