1418: PIPI的藏宝图

题目描述

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);
} 
发布了78 篇原创文章 · 获赞 7 · 访问量 4549

猜你喜欢

转载自blog.csdn.net/weixin_44433678/article/details/105024618