1 #include<stdio.h> 2 #include<string.h> 3 int dp[1050][15],a[55][55],x[15],y[15],dist[15][15]; 4 int mabs(int x) 5 { 6 return x>0?x:-x; 7 } 8 int main() 9 { 10 int n,m,cnt,i,j,k,s,minn,temp; 11 while (~scanf("%d%d",&n,&m)) 12 { 13 cnt=-1; 14 for (i=1;i<=n;i++) 15 for (j=1;j<=m;j++) 16 { 17 scanf("%d",&a[i][j]); 18 if (a[1][1]) a[1][1]=0; 19 if (a[i][j]) {cnt++; x[cnt]=i; y[cnt]=j; } 20 } 21 if (cnt==-1) {printf("0\n"); continue; } 22 for (i=0;i<=cnt;i++) 23 for (j=0;j<=cnt;j++) dist[i][j]=mabs(x[i]-x[j])+mabs(y[i]-y[j]); 24 s=(1<<(cnt+1))-1; 25 memset(dp,0,sizeof(dp)); 26 for (i=1;i<=s;i++) 27 for (j=0;j<=cnt;j++) 28 if ((i&(1<<j))!=0) 29 { 30 temp=i^(1<<j); minn=100000; 31 for (k=0;k<=cnt;k++) 32 if ((temp&(1<<k))!=0) 33 { 34 if (dist[k][j]+dp[temp][k]<minn) minn=dp[temp][k]+dist[k][j]; 35 } 36 if (minn==100000) dp[i][j]=x[j]+y[j]-2; 37 else dp[i][j]=minn; 38 } 39 minn=100000; 40 for (i=0;i<=cnt;i++) 41 if (dp[s][i]+x[i]+y[i]-2<minn) minn=dp[s][i]+x[i]+y[i]-2; 42 printf("%d\n",minn); 43 } 44 }
转载于:https://www.cnblogs.com/xiao-xin/articles/4034144.html