难度:普及-
题目类型: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!
这道题让我领悟到审题的重要性。微笑。