牛客算法周周练7-A-收集纸片-dfs解决图的路径问题

中文题。

这题我写了半个小时。。。

我是真的菜

我只想到bfs、枚举暴力、最小生成树。

dfs很关键,多练练吧。

AC代码:

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<map>
 4 #include<algorithm>
 5 #include<queue>
 6 #include<stack>
 7 #include<cmath>
 8 #include<string.h>
 9 
10 using namespace std;
11 #define mem(p,b) memset(p,b,sizeof(p))
12 #define inf 0x3f3f3f3f
13 typedef long long ll;
14 
15 const int N=150;
16 struct node
17 {
18     int x,y;
19 }a[N];
20 bool book[N];
21 int roomx,roomy,myx,myy,n,ans;
22 
23 int d(int x1,int y1,int x2,int y2)
24 {
25     return abs(x2-x1)+abs(y2-y1);
26 }
27 
28 void dfs(int cnt,int x,int y,int minn)
29 {
30     if(cnt==n)
31     {
32         minn=minn+d(myx,myy,x,y);
33         ans=min(ans,minn);
34         return;
35     }
36     for(int i=1;i<=n;i++)
37     {
38         if(!book[i])
39         {
40             book[i]=1;
41             int len=minn+d(x,y,a[i].x,a[i].y);
42             dfs(cnt+1,a[i].x,a[i].y,len);
43             book[i]=0;
44         }
45     }
46 }
47 
48 int main()
49 {
50     int T;
51     scanf("%d",&T);
52     while(T--)
53     {
54         mem(book,0);
55         scanf("%d %d",&roomx,&roomy);
56         scanf("%d %d",&myx,&myy);
57         scanf("%d",&n);
58         for(int i=1;i<=n;i++)
59             scanf("%d %d",&a[i].x,&a[i].y);
60         ans=inf;
61         dfs(0,myx,myy,0);
62         printf("The shortest path has length %d
",ans);
63     }
64     return 0;
65 }
View Code
原文地址:https://www.cnblogs.com/OFSHK/p/12919688.html