题目描述
PIPI获得了一份藏宝图,上面记载了k个宝物的地点,PIPI想去把他们全部都收集起来。
已知PIPI从(sx,sy)出发,每次只能往上下左右四个方向走一步,当他收集完所有的宝藏还需返回出发地点。
请问,PIPI收集完宝藏并返回出发点所需要走的最短路程是多少?
输入
第一行输入三个正整数sx,sy,k,其中sx,sy<=10^9,k<=10。
接下来k行,每行两个正整数xi,yi(xi,yi<=10^9),表示第i个宝物在(xi,yi)。
输出
输出PIPI收集完宝藏并返回出发点所需要走的最短路程。
样例输入
1 1 4
2 3
5 5
9 4
6 5
样例输出
24
思路:将所有坐标按照先x后y的顺序排序,然后进行全排列,枚举每一种情况时的ans的大小,取最小值
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll sx,sy,k;
const ll INF=1e18;
pair<ll,ll> pr[12];
int main(){
scanf("%lld%lld%lld",&sx,&sy,&k);
for(int i=0;i<k;i++){
scanf("%lld%lld",&pr[i].first,&pr[i].second);
}
sort(pr,pr+k); ///next-permutation从当前序列的字典序开始向后枚举,所以先排序
ll ans=INF;
do{
ll ans1=0,nowx=sx,nowy=sy; ///ans1记录这轮的距离的值
ans1=abs(nowx-pr[0].first)+abs(nowy-pr[0].second);
for(int i=0;i<k-1;i++){
nowx=pr[i].first,nowy=pr[i].second;
ans1+=abs(nowx-pr[i+1].first)+abs(nowy-pr[i+1].second);
}
ans1+=abs(pr[k-1].first-sx)+abs(pr[k-1].second-sy); ///回到起点
ans=min(ans,ans1);
}while(next_permutation(pr,pr+k)); ///将pr数组进行全排列,枚举每一种情况
printf("%lld",ans);
}