题目链接 https://www.jisuanke.com/course/1797/171531
题解:给10个宝藏编号1-10,因为要搜完所有宝藏,所以宝藏搜索得有个顺序,所以就全排列把1,2,3,4,5,6,7,8,9,10这样的序列全部排列枚举出来,每种情况下计算总的花费即可 ,计算花费的话就直接用2个点横纵坐标之差。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct Node {
int x,y;
} node[20];
int a[10] = {1,2,3,4,5,6,7,8,9,10};
// node[i]和node[j]之间的距离
int getDist(int i,int j) {
return abs(node[i].x-node[j].x)+abs(node[i].y-node[j].y);
}
int main() {
// node[1].x=2 , node[1].y=7;
// node[2].x=3 , node[2].y=4;
node[2].x=2 , node[2].y=7;
node[1].x=3 , node[1].y=4;
node[3].x=4 , node[3].y=3;
node[4].x=4 , node[4].y=5;
node[5].x=5 , node[5].y=3;
node[6].x=5 , node[6].y=10;
node[8].x=6 , node[8].y=8;
node[7].x=7, node[7].y=7;
node[9].x=9 , node[9].y=2;
node[10].x=10,node[10].y=10;
int res = 99999999;
do {
int t = 0;
t += node[a[0]].x-1+node[a[0]].y-1;// 起点到第一个点的距离
t += 10-node[a[9]].x+node[a[9]].y-1;// 起点到最后一个点的距离
for(int i = 0;i < 9;i++) {
t += abs(node[a[i]].x-node[a[i+1]].x)+abs(node[a[i]].y-node[a[i+1]].y);
}
if(t < res) {
printf("%d\n",t);
res = t;
}
} while(next_permutation(a,a+10));
printf("%d\n",res);
return 0;
}