#include<bits/stdc++.h>
#define ull unsigned long long
#define ll long long
using namespace std;
int n,k,a,b,c,m[102][102],ans=INT_MAX;
const int dx[5]={0,0,1,0,-1},dy[5]={0,1,0,-1,0};
struct Node{
int i,j,k,d;
bool operator <(const Node b)const{return d<b.d;}
};
priority_queue<Node>q;
int dis[102][102][11];
bool vis[102][102][11];
int main(){
memset(dis,0x3f3f3f3f,sizeof(dis));
cin>>n>>k>>a>>b>>c;
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
cin>>m[i][j];
q.push((Node){1,1,k,0});
dis[1][1][k]=0;
while(!q.empty()){
int x=q.top().i,y=q.top().j,fuel=q.top().k;
q.pop();
if (vis[x][y][fuel]) continue;
vis[x][y][fuel]=true;
if (m[x][y]&&fuel!=k){
if (dis[x][y][k]>dis[x][y][fuel]+a)
q.push((Node){x,y,k,dis[x][y][k]=dis[x][y][fuel]+a});
continue;
}
else
if (dis[x][y][k]>dis[x][y][fuel]+a+c)
q.push((Node){x,y,k,dis[x][y][k]=dis[x][y][fuel]+a+c});
if (fuel<=0) continue;
for (int i=1;i<=4;i++){
int fx=x+dx[i],fy=y+dy[i];
if (fx<1||fx>n||fy<1||fy>n) continue;
int addition=(fx<x||fy<y)?b:0;
if (dis[fx][fy][fuel-1]>dis[x][y][fuel]+addition)
q.push((Node){fx,fy,fuel-1,dis[fx][fy][fuel-1]=dis[x][y][fuel]+addition});
}
}
for (int i=0;i<=k;i++){
ans=min(dis[n][n][i],ans);
//cout<<dis[n][n][i]<<' ';
}
cout<<ans;
return 0;
}
如题,调了好久还是过不去