#include<iostream>
#include<queue>
using namespace std;
#define max 1001 //这里最后不能加分号,否则他把 max 的值定义为“1001;”
int s[10][10];
int t[10][10][5];
int map[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int i,j,k,x,y;
struct node
{
int x;
int y;
int state;
}start,temp,end;
//本题关键是不同的state的cost值导致的最少值有所不同,所以都要保留
void insert()
{
for(i=1;i<9;i++)
for(j=1;j<9;j++)
cin>>s[i][j];
for(i=1;i<=8;i++)
{
for(j=1;j<=8;j++)
{
for(k=1;k<=4;k++)
t[i][j][k]=100000000;
}
}
t[start.y][start.x][1]=0;
}
void bfs(queue<struct node>qu)
{
int v,ans;
while(!qu.empty())
{
temp=qu.front();
qu.pop();
for(i=0;i<4;i++)
{
x=temp.x+map[i][0];
y=temp.y+map[i][1];
if(x>0 && x<9 && y>0 && y<9 )
{
start.x=x;
start.y=y;
v=t[temp.y][temp.x][temp.state]+temp.state*s[y][x];
start.state=(temp.state*s[y][x]%4)+1;
if(v<t[y][x][start.state])
{
qu.push(start);
t[y][x][start.state]=v;
}
// s[y][x]=max;
}
}
}
ans=t[end.y][end.x][1];
for(i=2;i<=4;i++)
{
if(ans>t[end.y][end.x][i])
ans=t[end.y][end.x][i];
}
cout<<ans<<endl;
}
//清为128之前的数就是一个大数16843009等,清128之后就是负数,清0就是0
int main()
{
int a[2],b[2];
while(cin>>a[0]>>a[1]>>b[0]>>b[1] && !(a[0]==0&&a[1]==0&&b[0]==0&&b[1]==0))
{
// memset(s,max,sizeof(s)); //这里memset好像不能让整个数组s都清值,所以上面不能省
queue<struct node>qu;
start.x=a[1];
start.y=a[0];
start.state=1;
insert();
s[a[0]][a[1]]=max;
end.x=b[1];
end.y=b[0];
qu.push(start);
bfs(qu);
}
return 0;
}