Cod sursa(job #2185080)

Utilizator CristyXtremeSimion Cristian CristyXtreme Data 24 martie 2018 12:58:42
Problema Kdrum Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.6 kb
#include <cstdio>
#include <queue>
#define inf 0x3f3f3f3f

using namespace std;

FILE *g=fopen("kdrum.out","w");
int n,m,k,map[52][52],map2[52][52],resturi[52][52],dl[4]={-1,0,1,0},dc[4]={0,1,0,-1},xc,yc,xv,yv,xi,yi,xf,yf;
struct triplu{int x,y,rest;};
queue <triplu> Q;

void citire()
{
    FILE *f=fopen("kdrum.in","r");
    fscanf(f,"%i %i %i",&n,&m,&k);
    fscanf(f,"%i %i %i %i",&xi,&yi,&xf,&yf);
    for(int i=1;i<n+1;i++)
        for(int j=1;j<m+1;j++)
        {
            fscanf(f,"%i",&map[i][j]);
            if(map[i][j]!=0)
                map2[i][j]=inf;
            resturi[i][j]=map[i][j];
        }
}

void bordare()
{
    for(int i=0;i<n+2;i++)
    {
        map[i][0]=-1;
        map[i][m+1]=-1;
        map2[i][0]=-1;
        map2[i][m+1]=-1;
        resturi[i][0]=-1;
        resturi[i][m+1]=-1;
    }
    for(int i=0;i<m+2;i++)
    {
        map[0][i]=-1;
        map[n+1][i]=-1;
        map2[0][i]=-1;
        map2[n+1][i]=-1;
        resturi[0][i]=-1;
        resturi[n+1][i]=-1;
    }
}

void lee()
{
    map2[xi][yi]=1;
    triplu t;
    t.x=xi;
    t.y=yi;
    t.rest=k;
    Q.push(t);
    while(!Q.empty())
    {
        xc=Q.front().x;
        yc=Q.front().y;
        for(int i=0;i<4;i++)
        {
            xv=xc+dl[i];
            yv=yc+dc[i];
            if((map2[xv][yv]>0)&&(map2[xc][yc]+1<map2[xv][yv]))
            {
                if((Q.front().rest/resturi[xv][yv]>0)&&(Q.front().rest/resturi[xv][yv]<resturi[xv][yv]))
                {
                    map2[xv][yv]=map2[xc][yc]+1;
                    t.x=xv;
                    t.y=yv;
                    t.rest=Q.front().rest/resturi[xv][yv];
                    resturi[xv][yv]=Q.front().rest/resturi[xv][yv];
                    Q.push(t);
                }
                else
                {
                    map2[xv][yv]=map2[xc][yc]+1;
                    t.x=xv;
                    t.y=yv;
                    t.rest=Q.front().rest;
                    Q.push(t);
                }
            }
        }
        Q.pop();
    }
}

int main()
{
    citire();
    bordare();
    lee();
    /*for(int i=0;i<n+2;i++)
    {
        for(int j=0;j<m+2;j++)
            printf("%2i ",map[i][j]);
        printf("\n");
    }
    for(int i=0;i<n+2;i++)
    {
        for(int j=0;j<m+2;j++)
            printf("%2i ",map2[i][j]);
        printf("\n");
    }
    for(int i=0;i<n+2;i++)
    {
        for(int j=0;j<m+2;j++)
            printf("%2i ",resturi[i][j]);
        printf("\n");
    }*/
    fprintf(g,"%i",map2[xf][yf]);
    return 0;
}