Pagini recente » Cod sursa (job #2404341) | Cod sursa (job #2225426) | Borderou de evaluare (job #1567456) | Cod sursa (job #3219361) | Cod sursa (job #1369687)
#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;
}