http://ac.jobdu.com/problem.php?pid=1091
#include<stdio.h>
#include <cstring>
static const int d[4][2] = {{0,-1},{0,1},{-1,0},{1,0}};
static int value[6][6];
static bool mark[6][6];
static int mincost,sx,sy,ex,ey;
bool isGood(int x,int y){
if(x>=0&& y>=0 && x<6 && y<6 && !mark[x][y]) return true;
return false;
}
void dfs(int x,int y,int cost,int stat){
if(cost > mincost) return;
if(x==ex && y==ey){
if(cost < mincost){
mincost = cost;
}
return;
}
for (int i = 0; i < 4; ++i) {
int xn = x+d[i][0];
int yn = y+d[i][1];
if(!isGood(xn,yn)) continue;
int costn = cost + stat*value[xn][yn];
mark[xn][yn] = true;
int statn = (stat*value[xn][yn])%4+1;
dfs(xn,yn,costn,statn);
mark[xn][yn] = false;
}
}
int main(){
//freopen("in/1091.in","r",stdin);
int nCase;
scanf("%d",&nCase);
while(nCase--){
for (int i = 0; i < 6; ++i) {
for (int j = 0; j < 6; ++j) {
scanf("%d",&value[i][j]);
}
}
scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
memset(mark,false,sizeof(mark));
mincost = 0x7fffffff;
//only when revisting start point is allowed , it could be accepted -_-!
//mark[sx][sy] = true;
dfs(sx,sy,0,1);
printf("%d\n",mincost);
}
}