直接最短路即可 , 见代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long LL;
const int INF=1e9+7;
inline LL read(){
register LL x=0,f=1;register char c=getchar();
while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
while(c>=48&&c<=57)x=(x<<3)+(x<<1)+(c&15),c=getchar();
return f*x;
}
const int N=101;
const int M=11;
int dis[N][N][M];bool a[N][N],inq[N][N][M];
int n,K,A,B,C,ans=INF;
struct Node{
int x,y,k;
};
queue <Node> q;
int d[4][2]={1,0,0,1,0,-1,-1,0};
inline void BFS(){
memset(dis,0x3f,sizeof dis);
memset(inq,0,sizeof inq);
q.push((Node){1,1,K});inq[1][1][K]=1;dis[1][1][K]=0;
while(!q.empty()){
int x=q.front().x,y=q.front().y,k=q.front().k;inq[x][y][k]=0;q.pop();
if(a[x][y]&&k!=K){
if(dis[x][y][k]+A<dis[x][y][K]){
dis[x][y][K]=dis[x][y][k]+A;
if(!inq[x][y][K])
q.push((Node){x,y,K}),inq[x][y][K]=1;
}
continue;
}
if(dis[x][y][k]+A+C<dis[x][y][K]){
dis[x][y][K]=dis[x][y][k]+A+C;
if(!inq[x][y][K])
inq[x][y][K]=1,q.push((Node){x,y,K});
}
if(k>0)
for(int i=0;i<4;i++){
int tx=x+d[i][0],ty=y+d[i][1];
if(tx<1||tx>n||ty<1||ty>n) continue;
int cost=B*(tx<x||ty<y);
if(dis[x][y][k]+cost<dis[tx][ty][k-1]){
dis[tx][ty][k-1]=dis[x][y][k]+cost;
if(!inq[tx][ty][k-1])
inq[tx][ty][k-1]=1,q.push((Node){tx,ty,k-1});
}
}
}
}
int main(){
n=read(),K=read(),A=read(),B=read(),C=read();
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
a[i][j]=read();
}
BFS();
for(int i=0;i<=K;i++)
ans=min(ans,dis[n][n][i]);
printf("%d
",ans);
}