题目传送
#include<bits/stdc++.h>
using namespace std;
int n,m,b[101],sum=INT_MAX,vis[105][105];
struct s{
int date,num;
}a[105][105];
void dfs(int k,int x,int y,int d){
if(x>n||y>n||vis[x][y]==1){
return;
}
if(m==d&&x==n&&y==n){
sum=min(sum,k);
return;
}
if(a[x][y].num==b[d+1]){
vis[x][y]=1;
dfs(k+a[x][y].date,x+1,y,d+1);
dfs(k+a[x][y].date,x,y+1,d+1);
dfs(k+a[x][y].date,x-1,y,d+1);
dfs(k+a[x][y].date,x,y-1,d+1);
vis[x][y]=0;
return;
}
vis[x][y]=1;
dfs(k+a[x][y].date,x+1,y,d);
dfs(k+a[x][y].date,x,y+1,d);
dfs(k+a[x][y].date,x-1,y,d);
dfs(k+a[x][y].date,x,y-1,d);
vis[x][y]=0;
return;
}
int main(){
cin>>n;
int temp=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j].date;
a[i][j].num=temp++;
}
}
cin>>m;
for(int i=1;i<=m;i++){
cin>>b[i];
}
dfs(0,1,1,0);
cout<<sum;
return 0;
}