Cod sursa(job #878007)

Utilizator ard_procesoareLupicu ard_procesoare Data 13 februarie 2013 18:28:55
Problema Kdrum Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("kdrum.in");
ofstream fout("kdrum.out");
queue <int> qx,qy,qval,qdrum;
int v[53][53],d[53][53],n,m,k,x1,x2,y1,y2;
void read()
{
    fin>>n>>m>>k>>x1>>y1>>x2>>y2;
    int i,j;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            fin>>v[i][j];
}
void baga1(int x,int y,int val)
{
    if(v[x][y]==0)
    {
        d[x][y]=-1;
        return ;
    }
    if(d[x][y])
        return ;
    d[x][y]=val;
    qx.push(x);
    qy.push(y);
    qval.push(val);
    return ;

}
void bfs1(int x,int y)
{
    qx.push(x);
    qy.push(y);
    qval.push(1);
    int a,b,val;
    while(!qx.empty())
    {
        a=qx.front();
        b=qy.front();
        val=qval.front();
        qx.pop();
        qy.pop();
        qval.pop();
        baga1(a+1,b,val+1);
        baga1(a-1,b,val+1);
        baga1(a,b+1,val+1);
        baga1(a,b-1,val+1);
    }
}
void baga2(int x,int y,int val,int drum)
{
    if(v[x][y]==0) return;
    qx.push(x);
    qy.push(y);
    qval.push(val*v[x][y]);
    qdrum.push(drum);
}
void bfs2(int x,int y)
{
    int a,b,val,drum;
    qx.push(x);
    qy.push(y);
    qval.push(v[x][y]);
    val=qval.front();
    qdrum.push(0);
    while(1)
    {
        a=qx.front();
        b=qy.front();
        val=qval.front();
        drum=qdrum.front();
        qx.pop();
        qy.pop();
        qval.pop();
        qdrum.pop();
        if(val>=k)
        {
            val=val%k;
            if(val==0)
            {
                fout<<drum+d[a][b];
                return;
            }
        }
        baga2(a+1,b,val,drum+1);
        baga2(a-1,b,val,drum+1);
        baga2(a,b+1,val,drum+1);
        baga2(a,b-1,val,drum+1);
    }
}
int main()
{
    read();
    bfs1(x2,y2);
    bfs2(x1,y1);/*
    int i,j;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
            fout<<d[i][j]<<" ";
        fout<<endl;
    }*/
}