zoukankan      html  css  js  c++  java
  • UVALive

    https://cn.vjudge.net/problem/UVALive-6455

    题目大意:题目上给出一个地图,其中@是人在地图上的出发点,#是墙,‘ . '是路。然后给出几个点,这些点表示财宝的所在地。问人是否能够得到所有的宝藏,如果能够的话给出所有的宝藏的最短的路径。

    解题思路:由于只有最多4个宝藏所在地,所以只要用bfs找出出发点和财宝所在地距离到达其他点的步数。因为最多只有4个宝藏,所以可以暴力找出出发点到所有宝藏的最短距离。

    暴力代码:

      1 #include<stdio.h>
      2 #include<string.h>
      3 #include<math.h>
      4 #include <bits/stdc++.h>
      5 using namespace std;
      6 int n,m,k;
      7 char s[110][110];
      8 int xx[4]= {1,-1,0,0},yy[4]= {0,0,1,-1};
      9 struct node
     10 {
     11     int x,y;
     12     int dis[10];
     13 } pos[10];
     14 int bfs(node tmp,int id)
     15 {
     16     queue<pair<int,pair<int,int> > >que;
     17     while(!que.empty())
     18         que.pop();
     19     int vis[110][110];
     20     memset(vis,0,sizeof(vis));
     21     que.push(make_pair(0,make_pair(tmp.x,tmp.y)));
     22     vis[tmp.x][tmp.y]=1;
     23     while(!que.empty())
     24     {
     25         int tx=que.front().second.first,ty=que.front().second.second,len=que.front().first;
     26         //printf("%d %d
    ",tx,ty);
     27         que.pop();
     28         for(int i=0; i<4; i++)
     29         {
     30             int lx=tx+xx[i],ly=ty+yy[i];
     31             if(0<=lx&&lx<n&&0<=ly&&ly<m)
     32             {
     33                 if(vis[lx][ly]==0&&s[lx][ly]!='#')
     34                 {
     35                     vis[lx][ly]=1;
     36                     que.push(make_pair(len+1,make_pair(lx,ly)));
     37                     for(int j=0; j<=k; j++)
     38                     {
     39                         if(j!=id&&lx==pos[j].x&&ly==pos[j].y)
     40                             pos[id].dis[j]=len+1;
     41                     }
     42                 }
     43             }
     44         }
     45     }
     46     return 0;
     47 }
     48 int main()
     49 {
     50     while(~scanf("%d%d",&n,&m))
     51     {
     52         if(n==0&&m==0)
     53             break;
     54         for(int i=0; i<n; i++)
     55         {
     56             scanf("%s",s[i]);
     57             for(int j=0; j<m; j++)
     58                 if(s[i][j]=='@')
     59                 {
     60                     pos[0].x=i;
     61                     pos[0].y=j;
     62                 }
     63         }
     64         scanf("%d",&k);
     65         for(int i=1; i<=k; i++)
     66         {
     67             scanf("%d%d",&pos[i].x,&pos[i].y);
     68             pos[i].x--;
     69             pos[i].y--;
     70         }
     71         for(int i=0; i<10; i++)
     72             for(int j=0; j<10; j++)
     73                 pos[i].dis[j]=-1;
     74         for(int i=0; i<=k; i++)
     75             bfs(pos[i],i);
     76 //        for(int i=1; i<=k; i++)
     77 //            if(pos[0].dis[i]==-1)
     78 //            {
     79 //                printf("-1
    ");
     80 //                break;
     81 //            }
     82         if(k==1)
     83         {
     84             printf("%d
    ",pos[0].dis[1]);
     85         }
     86         else if(k==2)
     87         {
     88             int minn=10000000;
     89             for(int i=1; i<=k; i++)
     90             {
     91                 for(int j=1; j<=k; j++)
     92                 {
     93                     if(i==j)
     94                         continue;
     95                     minn=min(minn,pos[0].dis[i]+pos[i].dis[j]);
     96                 }
     97             }
     98             printf("%d
    ",minn);
     99         }
    100         else if(k==3)
    101         {
    102             int minn=10000000;
    103             for(int i=1; i<=k; i++)
    104             {
    105                 for(int j=1; j<=k; j++)
    106                 {
    107                     for(int u=1; u<=k; u++)
    108                     {
    109                         if(i==j||j==u||i==u)
    110                             continue;
    111                         minn=min(minn,pos[0].dis[i]+pos[i].dis[j]+pos[j].dis[u]);
    112                     }
    113                 }
    114             }
    115             printf("%d
    ",minn);
    116         }
    117         else if(k==4)
    118         {
    119             int minn=10000000;
    120             for(int i=1; i<=k; i++)
    121             {
    122                 for(int j=1; j<=k; j++)
    123                 {
    124                     for(int u=1; u<=k; u++)
    125                     {
    126                         for(int v=1; v<=k; v++)
    127                         {
    128                             if(i==j||i==u||i==v||j==u||j==v||u==v)
    129                                 continue;
    130                             minn=min(minn,pos[0].dis[i]+pos[i].dis[j]+pos[j].dis[u]+pos[u].dis[v]);
    131                         }
    132                     }
    133                 }
    134             }
    135             printf("%d
    ",minn);
    136         }
    137 
    138     }
    139     return 0;
    140 }

    只是因为这个题目中的 k 是比较小的,如果 k 更大的话就不能暴力了。当 k 更大时可以用的 dfs 找到最短距离

    dfs代码:

      1 #include<stdio.h>
      2 #include<string.h>
      3 #include<math.h>
      4 #include <bits/stdc++.h>
      5 using namespace std;
      6 int n,m,k;
      7 char s[110][110];
      8 int xx[4]= {1,-1,0,0},yy[4]= {0,0,1,-1};
      9 struct node
     10 {
     11     int x,y;
     12     int dis[10];
     13 } pos[10];
     14 int bfs(node tmp,int id)
     15 {
     16     queue<pair<int,pair<int,int> > >que;
     17     while(!que.empty())
     18         que.pop();
     19     int vis[110][110];
     20     memset(vis,0,sizeof(vis));
     21     que.push(make_pair(0,make_pair(tmp.x,tmp.y)));
     22     vis[tmp.x][tmp.y]=1;
     23     while(!que.empty())
     24     {
     25         int tx=que.front().second.first,ty=que.front().second.second,len=que.front().first;
     26         //printf("%d %d
    ",tx,ty);
     27         que.pop();
     28         for(int i=0; i<4; i++)
     29         {
     30             int lx=tx+xx[i],ly=ty+yy[i];
     31             if(0<=lx&&lx<n&&0<=ly&&ly<m)
     32             {
     33                 if(vis[lx][ly]==0&&s[lx][ly]!='#')
     34                 {
     35                     vis[lx][ly]=1;
     36                     que.push(make_pair(len+1,make_pair(lx,ly)));
     37                     for(int j=0; j<=k; j++)
     38                     {
     39                         if(j!=id&&lx==pos[j].x&&ly==pos[j].y)
     40                             pos[id].dis[j]=len+1;
     41                     }
     42                 }
     43             }
     44         }
     45     }
     46     return 0;
     47 }
     48 int minn,vis[10];
     49 int dfs(int k,int tmp,int ans,int id)
     50 {
     51     if(tmp==k)
     52     {
     53         minn=min(minn,ans);
     54     }
     55     for(int i=1;i<=k;i++)
     56     {
     57         if(vis[i]==0)
     58         {
     59             vis[i]=1;
     60             dfs(k,tmp+1,ans+pos[id].dis[i],i);
     61             vis[i]=0;
     62         }
     63     }
     64     return 0;
     65 }
     66 int main()
     67 {
     68     while(~scanf("%d%d",&n,&m))
     69     {
     70         if(n==0&&m==0)
     71             break;
     72         for(int i=0; i<n; i++)
     73         {
     74             scanf("%s",s[i]);
     75             for(int j=0; j<m; j++)
     76                 if(s[i][j]=='@')
     77                 {
     78                     pos[0].x=i;
     79                     pos[0].y=j;
     80                 }
     81         }
     82         scanf("%d",&k);
     83         for(int i=1; i<=k; i++)
     84         {
     85             scanf("%d%d",&pos[i].x,&pos[i].y);
     86             pos[i].x--;
     87             pos[i].y--;
     88         }
     89         for(int i=0; i<10; i++)
     90             for(int j=0; j<10; j++)
     91                 pos[i].dis[j]=-1;
     92         for(int i=0; i<=k; i++)
     93             bfs(pos[i],i);
     94 //        for(int i=1; i<=k; i++)
     95 //            if(pos[0].dis[i]==-1)
     96 //            {
     97 //                printf("-1
    ");
     98 //                break;
     99 //            }
    100         memset(vis,0,sizeof(vis));
    101         minn=100000;
    102         dfs(k,0,0,0);
    103         if(minn==100000)
    104         printf("-1
    ");
    105         else
    106         printf("%d
    ",minn);
    107 
    108     }
    109     return 0;
    110 }
  • 相关阅读:
    水晶报表 VS2010 应用
    crystalreport使用方法
    spring MVC核心思想
    一台服务器配置多个TOMCAT
    SQL server索引
    锁机制
    JAVA书籍
    Live 直播过程
    html5 video微信浏览器视频不能自动播放
    设计模式 抽象工厂模式
  • 原文地址:https://www.cnblogs.com/wang-ya-wei/p/7354409.html
Copyright © 2011-2022 走看看