牛客算法周周练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\n",ans); 63 } 64 return 0; 65 }