计蒜客-故宫元宵节寻宝 全排列

题目链接 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;    
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值