Pagini recente » Cod sursa (job #3192968) | Cod sursa (job #3191091)
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
struct cell{
int line;
int colum;
};
int R,C;
int maze[1001][1001];
cell dragons[10001];
int dist_dragons[1001][1001];
int dist[1001][1001];
int sol;
int nr_dra=0;
cell IN,OUT;
queue<cell> Coada;
void create_dragon(int lin, int col){
dragons[++nr_dra]={lin,col};
maze[lin][col]=2;
}
void read(){
fin>>R>>C;
fin.get();
for(int i=1;i<=R;i++){
char s[1002];
fin.getline(s+1,1001);
for(int j=1;j<=C;j++){
switch(s[j]){
case '.':maze[i][j]=0;break;
case '*':maze[i][j]=1;break;
case 'D':create_dragon(i,j);break;
case 'I':IN.line=i;IN.colum=j;maze[i][j]=3; break;
case 'O':OUT.line=i;OUT.colum=j; maze[i][j]=4;break;
}
dist_dragons[i][j]=-1;
}
}
}
void empty_Coada(){
while(!Coada.empty()){
Coada.pop();
}
}
void Ini_dra(){
for(int i=1;i<=nr_dra;i++){
cell x=dragons[i];
Coada.push(x);
dist_dragons[x.line][x.colum]=0;
}
}
void Ini_person(){
dist[IN.line][IN.colum]=0;
Coada.push(IN);
}
int isValid(int line, int colum, int mat[][1001], int number){
if(line>=1 && line<=R && colum>=1 && colum <=C && mat[line][colum]==-1
&& maze[line][colum]!=1 && dist_dragons[line][colum]>=number)
return 1;
return 0;
}
void Lee(int mat[][1001], char C, int number){
empty_Coada();
int l[5]={-1,0,1,0};
int c[5]={0,1,0,-1};
switch(C){
case 'D': Ini_dra();break;
case 'F': Ini_person();break;
}
while(!Coada.empty()){
cell x=Coada.front();
Coada.pop();
for(int i=0;i<=3;i++){
int lin=x.line+l[i],col=x.colum+c[i];
if(isValid(lin,col, mat, number)){
Coada.push({lin,col});
mat[lin][col]=mat[x.line][x.colum]+1;
}
}
if(number>0 && mat[OUT.line][OUT.colum]!=-1){
break;
}
}
}
int max(int a, int b){
return (a>b?a:b);
}
void reset(){
for(int i=1;i<=R;i++){
for(int j=1;j<=C;j++){
dist[i][j]=-1;
}
}
}
int test(int number){
reset();
Lee(dist, 'F', number);
if(dist[OUT.line][OUT.colum]!=-1)
return 1;
return 0;
}
int main() {
read();
Lee(dist_dragons , 'D', -10);
int Right=R+C,Left=1,middle;
while(Left<Right){
middle=(Left+Right)/2;
int sem=test(middle);
if(sem==1){
sol=middle;
Left=middle+1;
}else{
Right=middle-1;
}
}
fout<<sol;
}