zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    flock对文件锁定读写操作的问题 简单
    hdu 2899 Strange Fuction(二分)
    hdu 2199 Can you solve this equation? (二分)
    poj 3080 Blue Jeans (KMP)
    poj 2823 Sliding Window (单调队列)
    poj 2001 Shortest Prefixes (trie)
    poj 2503 Babelfish (trie)
    poj 1936 All in All
    hdu 3507 Print Article (DP, Monotone Queue)
    fzu 1894 志愿者选拔 (单调队列)
  • 原文地址:https://www.cnblogs.com/lovychen/p/4016384.html
Copyright © 2011-2022 走看看