//http://www.cnblogs.com/IMGavin/ #include <iostream> #include <stdio.h> #include <cstdlib> #include <cstring> #include <queue> #include <vector> #include <map> #include <stack> #include <set> #include <bitset> #include <algorithm> using namespace std; typedef long long LL; #define gets(A) fgets(A, 1e8, stdin) const int INF = 0x3F3F3F3F, N = 108, MOD = 1003, M = 12; const double EPS = 1e-6; int dis[N][N][M]; bool inq[N][N][M]; int mp[N][N]; int dir[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; int n, k, a, b, c; struct node{ int x, y, k; node(int x1, int y1, int k1){ x = x1; y = y1; k = k1; } }; int SPFA(){ memset(dis, 0x3F, sizeof(dis)); memset(inq, 0, sizeof(inq)); dis[1][1][k] = 0; queue <node> q; q.push(node(1, 1, k)); while(!q.empty()){ node u = q.front(); q.pop(); inq[u.x][u.y][u.k] = 0; for(int i = 0; i < 4; i++){ int x1 = u.x + dir[i][0]; int y1 = u.y + dir[i][1]; if(x1 < 1 || y1 < 1 || x1 > n || y1 > n || u.k == 0){ continue; } node v(x1, y1, u.k - 1); int cost = dis[u.x][u.y][u.k]; if(dir[i][0] < 0 || dir[i][1] < 0){ cost += b; } if(!mp[v.x][v.y] && dis[v.x][v.y][v.k] > cost){ dis[v.x][v.y][v.k] = cost; if(!inq[v.x][v.y][v.k]){ inq[v.x][v.y][v.k] = 1; q.push(v); } } v.k = k; cost = dis[u.x][u.y][u.k] + a; if(dir[i][0] < 0 || dir[i][1] < 0){ cost += b; } if(!mp[v.x][v.y]){ cost += c; } if(dis[v.x][v.y][v.k] > cost){ dis[v.x][v.y][v.k] = cost; if(!inq[v.x][v.y][v.k]){ inq[v.x][v.y][v.k] = 1; q.push(v); } } } } int ans = INF; for(int i = 0; i <= k; i++){ ans = min(ans, dis[n][n][i]); } return ans; } int main(){ while(cin >> n >> k >> a >> b >> c){ for(int i = 1; i <= n; i++){ for(int j = 1; j <= n; j++){ scanf("%d", &mp[i][j]); } } cout<<SPFA()<<endl; } return 0; }