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 }
  • 相关阅读:
    要改变静态文本框的值,必须设置静态文本框控件的样式中(Notify通知)勾选
    MFC对话框中的编辑控件的7种操作方式
    孙鑫C++视频教程 rmvb格式 全20CD完整版
    Windows server2008 下 PowerShell对.NET3.5静默安装
    MFC关机函数
    PDI-KETTLE-2:KETTLE安装,环境变量配置,开发准备
    KETTLE常见问题记录第一篇【安装,资源库,数据库】
    日常问题解决记录一:远程桌面进程如果关闭了怎么呼出?
    KETTLE调度第二篇:把Jenkins调度Web启动设置为后台执行
    PDI-KETTLE-1:使用KETTLE如何设计一个作业-以数据库迁移为例
  • 原文地址:https://www.cnblogs.com/lovychen/p/4016384.html
Copyright © 2011-2022 走看看