1. 程式人生 > >UVALive - 6455 Stealing Harry Potter's Precious (bfs+dfs)

UVALive - 6455 Stealing Harry Potter's Precious (bfs+dfs)

span net pre [0 最短 set class bits printf

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

題目大意:題目上給出一個地圖,[email protected],#是墻,‘ . ‘是路。然後給出幾個點,這些點表示財寶的所在地。問人是否能夠得到所有的寶藏,如果能夠的話給出所有的寶藏的最短的路徑。

解題思路:由於只有最多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\n",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\n"); 80 // break; 81 // } 82 if(k==1) 83 { 84 printf("%d\n",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\n",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\n",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\n",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\n",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\n");
 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\n");
105         else
106         printf("%d\n",minn);
107 
108     }
109     return 0;
110 }

UVALive - 6455 Stealing Harry Potter's Precious (bfs+dfs)