题意:经典旅行商问题。一共只有十个地点。问全部游玩一遍再回到原点的步数。
题解:官方的DP看不懂。用next_permutation 这个函数。加上预先处理了一遍各个点之间的距离,AC了这道题目=。=官方的说的还是不够详细啊。。。
#include<iostream>
#include<string>
#include<algorithm>
#include<cstdlib>
#include<cstdio>
#include<set>
#include<map>
#include<vector>
#include<cstring>
#include<stack>
#include<cmath>
#include<queue>
#define INF 0x0f0f0f0f
using namespace std;
struct Node
{
int x;
int y;
};
int main()
{
Node p[20];
int b[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int i,j,k,l,m,n,temp,ans,imin;
int a[55][55];
while(scanf("%d%d",&n,&m)!=EOF)
{
k=0;
imin=INF;
ans=0;
memset(a,0,sizeof(a));
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
scanf("%d",&temp);
if(temp)
{
p[k].x=i;
p[k++].y=j;
}
}
}
for(i=0;i<=k;i++)
{
for(j=0;j<=k;j++)
{
a[i][j]=a[j][i]=abs(p[i].x-p[j].x)+abs(p[i].y-p[j].y);
}
}
// k--;
if(k==1)
{
printf("%d\n",p[0].x*2+p[0].y*2);
continue;
}
do
{
ans=abs(p[b[0]].x)+abs(p[b[0]].y);
for(i=1;i<=k-1;i++)
{
ans=ans+a[b[i]][b[i-1]];
}
i--;
ans=ans+abs(p[b[i]].x)+abs(p[b[i]].y);
if(ans<imin) imin=ans;
}while(next_permutation(b,b+k));
printf("%d\n",imin);
}
}