我看到10个点,就想到dp状态压缩,不过由于细节没注意,导致wa了。这题还可以bfs,不过复杂度比dp高多了。
#include <iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long LL;
#define inf 0x3f3f3f3f
const int N=11;
int x[N],y[N];
int mp[N][N];
int dp[1<<N][N];
int dis(int i,int j){
return abs(x[i]-x[j])+abs(y[i]-y[j]);
}
int main(){
int n,m,t;
while(cin>>n>>m){
x[0]=y[0]=1;
int cnt=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&t);
if(t!=0){
x[cnt]=i;
y[cnt]=j;
cnt++;
}
}
}
for(int i=0;i<cnt;i++)
for(int j=i;j<cnt;j++)
mp[i][j]=mp[j][i]=dis(i,j);
memset(dp,inf,sizeof dp);
dp[1][0]=0;
int s=1<<cnt,ns;
for(int i=1;i<s;i++){
for(int j=0;j<cnt;j++){
if(dp[i][j]==inf) continue;
for(int k=0;k<cnt;k++){
if((i&(1<<k))) continue;
ns=i|(1<<k);
dp[ns][k]=min(dp[ns][k],dp[i][j]+mp[j][k]);
}
}
}
int ans=inf;
for(int i=0;i<cnt;i++)//i=1 is wa
ans=min(ans,dp[s-1][i]+mp[i][0]);
printf("%d\n",ans);
}
return 0;
}
/*
2 2
1 1
1 1
1 1
0
*/