1433 吃奶酪

难度:普及-

题目类型:DFS

提交次数:5

涉及知识:DFS

题目描述

房间里放着n块奶酪。一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处。

输入输出格式

输入格式:

第一行一个数n (n<=15)

接下来每行2个实数,表示第i块奶酪的坐标。

两点之间的距离公式=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))

输出格式:

一个数,表示要跑的最少距离,保留2位小数。

代码:

 1 #include<iostream>
 2 #include<cmath>
 3 #include<cstdio>
 4 using namespace std;
 5 int n;
 6 double pos[16][2];
 7 double dis[16][16];
 8 bool visited[16];
 9 double total;
10 double ans = 100001;
11 void dfs(int num, int step){
12     if(step == n){
13         ans = min(total, ans);
14         return;
15     } 
16     if(total>=ans) return;
17     for(int i = 1; i <= n; i++){
18         if(!visited[i]){
19             visited[i] = true;
20             total += dis[num][i];
21             dfs(i, step+1);
22             visited[i] = false;
23             total -= dis[num][i];
24         }
25     }
26 }
27 int main(){
28     cin>>n;
29     int i, j;
30     for(i = 1; i <= n; i++){
31         cin>>pos[i][0]>>pos[i][1];
32     }
33     for(i = 0; i <= n; i++)
34         for(j = 0; j <= n; j++)
35             dis[i][j] = sqrt((pos[i][0]-pos[j][0])*(pos[i][0]-pos[j][0])+(pos[i][1]-pos[j][1])*(pos[i][1]-pos[j][1]));
36     dfs(0, 0);
37     printf("%.2f", ans);
38     return 0;
39 }

备注

赤裸裸的DFS水题!!可我没认真审题,没注意是从(0,0)出发,活生生写了一遍kruskal!!!!讨论误导啊!!不过就当复习了!

可我为什么交了5遍呢?double和float又坑我啊!改完以后还不对?坐标是实数啊!不是整数啊!所以这里面所有的数都是double!

这道题让我领悟到审题的重要性。微笑。

原文地址:https://www.cnblogs.com/fangziyuan/p/5936361.html