题目
取宝石问题
假设在一个大房间有n个宝石,每一处宝石用一个坐标(x, y)表示。如果你从任意一处宝石的地方出发,依次经过每个放宝石的地方并取走宝石,最终要求回到出发地点,问最短需要走的距离是多少。
本题允许走直线。
思路
采用枚举法,在这个情境里,经过不同地点的顺序会改变最终的行走距离。所以,我们要枚举的就是经过1~n一共n个位置的顺序。
枚举n个位置的顺序其实是一个排列问题, 那么可以直接用 C++ 中的 next_permutation 函数来快速获得下一个排列,获得下一个排列的时间复杂度为 O(n) 。
细节
起始点和终点时固定的,所以数组的第一个数和最后一个数不参加排列。
代码
#include <bits/stdc++.h>
#define N 15
using namespace std;
int n = 4; // 4个宝石
int id[N] = {
0, 1, 2, 3, 4, 0};