题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4771
题目意思:‘@‘ 表示的是起点,‘#‘ 表示的是障碍物不能通过,‘.‘ 表示的是路能通过的;
目的:让你从 ‘@‘ 点出发,然后每个点只能走一次,求出最小的距离;
解题思路:先用 bfs 求解出任意两点之间的距离,用 ans[i][j],表示点 i 到点 j 的距离;
然后用 dfs 递归求出从起点经过所有点的距离中,比较出最小的;
AC代码:
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 #include<queue> 6 #include<string> 7 #include<cmath> 8 using namespace std; 9 int dir[4][2]={0,1,0,-1,1,0,-1,0}; 10 int m,n; 11 int sx,sy,T; 12 int ans[6][6];//点之间的距离 13 char Map[110][110]; 14 int vis[110][110];//标记路径 15 struct node 16 { 17 int x,y,step; 18 }a[6],now,eed; 19 int bfs(int T1,int ee,int vv) 20 { 21 int TT=0; 22 vis[a[T1].x][a[T1].y]=vv;//每次标记的都发生了变化,这样vis数组不用每次都清零 23 queue< node >p; 24 now.x = a[T1].x; 25 now.y = a[T1].y; 26 now.step = 0; 27 p.push(now); 28 while(!p.empty()) 29 { 30 now=p.front(); 31 p.pop(); 32 for(int i=T1+1; i<=T; i++) 33 { 34 if(now.x == a[i].x && now.y == a[i].y) 35 { 36 ans[T1][i]=ans[i][T1] = now.step; 37 TT++; 38 } 39 } 40 for(int i=0; i<4; i++) 41 { 42 eed.x = now.x + dir[i][0]; eed.y = now.y + dir[i][1]; 43 if(eed.x>=1 && eed.x<=m && eed.y>=1 && eed.y<=n && vis[eed.x][eed.y]!=vv && Map[eed.x][eed.y]!=‘#‘) 44 { 45 eed.step = now.step+1; 46 vis[eed.x][eed.y] = vv; 47 p.push(eed); 48 } 49 } 50 if(TT == ee) //如果该访问的点都访问了,直接返回; 51 return 1; 52 } 53 return -1 ;//如果其中有点不能访问到,直接返回-1,输出 -1 ; 54 } 55 56 int net[10],ans1; 57 void dfs(int x,int step,int sum) 58 { 59 if(step==T) 60 { 61 if(ans1>sum) ans1=sum; 62 return; 63 } 64 for(int i=0;i<=T;i++) 65 if(!net[i]) 66 { 67 net[i]=1; 68 dfs(i,step+1,sum+ans[x][i]); 69 net[i]=0; 70 } 71 } 72 int main() 73 { 74 int x,y; 75 // freopen("in1.txt","r",stdin); 76 // freopen("out1.txt","w",stdout); 77 while(cin>>m>>n && m+n) 78 { 79 ans1=1000000; 80 memset(ans,0,sizeof(ans)); 81 memset(net,0,sizeof(net)); 82 memset(vis,0,sizeof(vis)); 83 for(int i=1; i<=m; i++) 84 for(int j=1; j<=n; j++) 85 { 86 scanf(" %c",&Map[i][j]); 87 if(Map[i][j] == ‘@‘) 88 { 89 sx= i; sy = j; 90 } 91 } 92 scanf("%d",&T); 93 a[0].x=sx; a[0].y=sy; 94 for(int i=1; i<=T; i++) 95 { 96 scanf("%d %d",&x,&y); 97 a[i].x = x; 98 a[i].y = y; 99 } 100 int flag = 0 ; 101 for(int i = 0; i<T; i++) 102 { 103 104 flag = bfs(i,T-i,i+1); 105 if(flag == -1) 106 break; 107 } 108 if(flag == -1) 109 printf("-1\n"); 110 else 111 { 112 net[0]=1; 113 dfs(0,0,0); 114 printf("%d\n",ans1); 115 } 116 } 117 return 0; 118 }
hdu 4771 Stealing Harry Potter's Precious (2013亚洲区杭州现场赛)(搜索 bfs + dfs) 带权值的路径
时间: 2024-09-29 19:38:15