题意是给一个起点以及另外x个点,找出从一直点到这n个点然后再回到起点的最短路程。这个题由于图的大小不超过20*20并且要找的东西<10个,所以将每一种排列情况都找一下,从中找出最小的路程数,这样并不超时。
#include <iostream>
#include <string.h>
#include <cstdlib> //用于abs()这个函数,以前一直以为是cmath呢 - -、
using namespace std;
int vis[21],map[21][2];
int s,t,x,m,n,cnt,path,ans;
void dfs(int a,int b)
{
int tmp,i;
if(cnt==x)
{
tmp=path+abs(a-s)+abs(b-t);
if(tmp<ans)
ans=tmp;
return ;
}
for(i=0;i<x;i++)
{
if(vis[i]) continue;
vis[i]=1;
tmp=abs(map[i][0]-a)+abs(map[i][1]-b);
cnt++;
path+=tmp;
dfs(map[i][0],map[i][1]);
cnt--;
path-=tmp;
vis[i]=0;
}
}
int main()
{
int tt;
cin>>tt;
while(tt--)
{
memset(vis,0,sizeof(vis));
cnt=path=0;
ans=999999999;
cin>>m>>n>>s>>t>>x;
for(int i=0;i<x;i++)
{
cin>>map[i][0]>>map[i][1];
}
dfs(s,t);
cout<<"The shortest path has length "<<ans<<endl;
}
return 0;
}