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

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

 

題目大意:題目上給出一個地圖,其中@是人在地圖上的出發點,#是牆,‘ . '是路。而後給出幾個點,這些點表示財寶的所在地。問人是否可以獲得全部的寶藏,若是可以的話給出全部的寶藏的最短的路徑。c++

 

解題思路:因爲只有最多4個寶藏所在地,因此只要用bfs找出出發點和財寶所在地距離到達其餘點的步數。由於最多隻有4個寶藏,因此能夠暴力找出出發點到全部寶藏的最短距離。spa

 

暴力代碼:.net

  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 找到最短距離code

 

dfs代碼:blog

  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 }
相關文章
相關標籤/搜索