好吧,这还是一道分层图的spfa,这道题注意一下加油的条件,分情况判断就行。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
struct node
{
int x,y,k;
};
int dx[4] = {0,1,-1,0};
int dy[4] = {1,0,0,-1};
int dis[101][101][15],vis[101][101][15],mp[101][101];
const int INF = 0x3f3f3f3f;
int n,m,k,a,b,c;
void bfs()
{
memset(dis,20,sizeof(dis));
dis[1][1][k] = 0;
vis[1][1][k] = 1;
queue<node> q;
q.push((node){1,1,k});
while(!q.empty())
{
node now = q.front();
q.pop();
int X = now.x;
int Y = now.y;
int K = now.k;
vis[X][Y][K] = 0;
if(mp[X][Y] && K != k)
{
if(dis[X][Y][k] > dis[X][Y][K] + a)
{
dis[X][Y][k] = dis[X][Y][K] + a;
if(!vis[X][Y][k])
{
vis[X][Y][k] = 1;
q.push((node){X,Y,k});
}
}
continue;
}
else
{
if(dis[X][Y][k] > dis[X][Y][K] + a+ c)
{
dis[X][Y][k] = dis[X][Y][K] + a+ c;
if(!vis[X][Y][k])
{
vis[X][Y][k] =1;
q.push((node){X,Y,k});
}
}
}
if(K >0 )
{
for(int i = 0;i<4;i++)
{
int x = X + dx[i];
int y = Y + dy[i];
if(x < 1 || y < 1 || x > n || y > n) continue;
int len = 0;
if(x < X || y < Y) len = b;
if(dis[x][y][K-1] > dis[X][Y][K] + len)
{
dis[x][y][K-1] = dis[X][Y][K] + len;
if(!vis[x][y][K-1])
{
vis[x][y][K-1] = 1;
q.push((node){x,y,K-1});
}
}
}
}
}
int ans = INF;
for(int i = 0;i<k;i++)
{
ans = min(ans,dis[n][n][i]);
}
printf("%d\n",ans);
}
int main()
{
scanf("%d%d%d%d%d",&n,&k,&a,&b,&c);
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=n;j++)
{
scanf("%d",&mp[i][j]);
}
}
bfs();
return 0;
}