hdu 4771 Stealing Harry Potter's Precious (2013亚洲区杭州现场赛)(搜索 bfs + dfs) 带权值的路径

题目链接: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
");
110         else
111         {
112             net[0]=1;
113             dfs(0,0,0);
114             printf("%d
",ans1);
115         }
116   }
117   return 0;
118 }
原文地址:https://www.cnblogs.com/lovychen/p/4016384.html