Cod sursa(job #2059666)

Utilizator EmplopiStefan Nitu Emplopi Data 7 noiembrie 2017 13:12:25
Problema Barbar Scor 40
Compilator c Status done
Runda Arhiva de probleme Marime 2 kb
#include <stdio.h>
#include <stdlib.h>

int mat[1002][1002], dirx[4]={-1, 0, 1, 0}, diry[4]={0, 1, 0, -1}, coada[3][1000000];
char ver[1002][1002];
int sx, sy, fx, fy, zs, zf;


void add(int i, int j, int nr){
    coada[0][zf]=i;
    coada[1][zf]=j;
    coada[2][zf]=nr;
    zf++;
}

void lee(){
    int y, i;
    for(i=zs;i<zf;i++){
        mat[coada[0][i]][coada[1][i]]=coada[2][i];
        for(y=0;y<4;y++)
            if(mat[coada[0][i]+dirx[y]][coada[1][i]+diry[y]]==0)
                add(coada[0][i]+dirx[y], coada[1][i]+diry[y], coada[2][i]+1);
    }
}

void lee2(int nr){
    int y, i;
    for(i=zs;i<zf;i++){
        ver[coada[0][i]][coada[1][i]]=1;
        for(y=0;y<4;y++)
            if(ver[coada[0][i]+dirx[y]][coada[1][i]+diry[y]]==0 && mat[coada[0][i]+dirx[y]][coada[1][i]+diry[y]]>=nr)
                add(coada[0][i]+dirx[y], coada[1][i]+diry[y], 1);
    }
}

void curat(int r, int c){
    int i, j;
    for(i=1;i<=r;i++)
        for(j=1;j<=c;j++)
            ver[i][j]=0;
}

int main(){
    FILE *fin, *fout;
    int r, c, i, j, poz, pas;
    char ch;
    fin=fopen("barbar.in", "r");
    fout=fopen("barbar.out", "w");
    fscanf(fin, "%d%d ", &r, &c);
    for(i=0;i<=r+1;i++){
        mat[i][0]=-1;
        mat[i][c+1]=-1;
    }
    for(i=0;i<=c+1;i++){
        mat[0][i]=-1;
        mat[r+1][i]=-1;
    }
    zs=0;
    zf=0;
    for(i=1;i<=r;i++){
        for(j=1;j<=c;j++){
            fscanf(fin, "%c", &ch);
            if(ch=='I'){
                sx=i;
                sy=j;
            }
            if(ch=='*')
                mat[i][j]=-1;
            if(ch=='O'){
                fx=i;
                fy=j;
            }
            if(ch=='D')
                add(i, j, 1);
        }
        fgetc(fin);
    }
    lee();
    pas=1<<9;
    poz=0;
    while(pas!=0){
        zs=0;
        zf=0;
        add(sx, sy, 1);
        lee2(poz+pas);
        if(ver[fx][fy]==1)
            poz+=pas;
        pas/=2;
        curat(r, c);
    }
    fprintf(fout, "%d", poz-1);
    fclose(fin);
    fclose(fout);

    return 0;
}