Cod sursa(job #1369687)

Utilizator CatlinvCatalin Sbera Catlinv Data 3 martie 2015 10:38:52
Problema Kdrum Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <iostream>
#include <fstream>
#include <queue>
#define pii pair <int,int>
#define x first
#define y second
using namespace std;
ifstream f("kdrum.in");
ofstream g("kdrum.out");
int v[55][55];
int lee[55][55];
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
int n,m;
int ok(int i, int j)
{
    if(i<=n && j<=m && i>=1 && j>=1)
        return 1;
    return 0;
}
queue <pii> que;
void bfs(pii poz)
{
    que.push(poz);
    int i,j;
    lee[poz.x][poz.y]=1;
    while(!que.empty())
    {
        pii nxt=que.front();
        que.pop();
        int in;
        for(in=0;in<4;in++)
            if(ok((nxt.x+dx[in]),(nxt.y+dy[in])) && v[nxt.x+dx[in]][nxt.y+dy[in]]!=0 && lee[nxt.x+dx[in]][nxt.y+dy[in]]==0)
                {
                    pii rez=nxt;
                    rez.x+=dx[in];
                    rez.y+=dy[in];
                    lee[rez.x][rez.y]=lee[nxt.x][nxt.y]+1;
                    que.push(rez);
                }
    }
}
int mini=2500;
void backt(pii poz, pii fin,int s,int k)
{
    int in;
    if(poz==fin)
    {
        if(k==1 && mini>s)
            mini=s;

    }
    for(in=0;in<4;in++)
    {
        pii rez=poz;
        rez.x+=dx[in];
        rez.y+=dy[in];
        if(ok(rez.x,rez.y) && lee[poz.x][poz.y]==lee[rez.x][rez.y]-1)
        {
            if(k%v[rez.x][rez.y]==0)
                backt(rez,fin,s+1,k/v[rez.x][rez.y]);
            else
                backt(rez,fin,s+1,k);
        }
    }
}
int main()
{
    int k;
    f>>n>>m>>k;
    pii start,finish;
    f>>start.x>>start.y>>finish.x>>finish.y;
    int i,j;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            f>>v[i][j];
    bfs(start);
    backt(start,finish,1,k);
    g<<mini;
    return 0;
}