• POJ 3206 Borg Maze (BFS+Prim)


    Borg Maze
     

    大意:给你一个m*n的迷宫,可以上下左右的走,只能走空格或字母,求出将所有字母连通起来的最小耗费。

    思路:先用BFS求出S到所有A的距离,再用Prim求最小生成树,求出最小耗费。这个题坑的不在题,是数据太坑了,在空格处理上没弄好,贡献了好几个WA和CE,看Discuss才知道很坑,最后用G++过了的代码,C++还RE,实在不知道说什么好了  =。=

      1 #include <stdio.h>
      2 #include <iostream>
      3 #include <string.h>
      4 #define INF 0xfffffff
      5 using namespace std;
      6 
      7 char str[55][55];
      8 int Map[55][55];
      9 int dis[55];
     10 int dist[105][105];
     11 int edge[105][105];
     12 int num, n, m, p    ;
     13 
     14 int Move[4][2] = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}};
     15 
     16 int min(int a, int b)
     17 {
     18     return a > b ? b : a;
     19 }
     20 
     21 void BFS(int i, int j)
     22 {
     23     int head = 0, tail = 0;
     24     int q_x[2550], q_y[2550];
     25     bool vis[55][55];
     26     memset(vis, false, sizeof(vis));
     27     memset(dist, 0, sizeof(dist));
     28     vis[i][j] = true;
     29     q_x[tail] = i;
     30     q_y[tail++] = j;
     31     while(head < tail)
     32     {
     33         int x = q_x[head];
     34         int y = q_y[head++];
     35         if(Map[x][y])
     36         {
     37             edge[Map[i][j]][Map[x][y]] = dist[x][y];
     38         }
     39         for(int t = 0; t < 4; t++)
     40         {
     41             int dx = x+Move[t][0];
     42             int dy = y+Move[t][1];
     43             if(dx >= 1 && dx <= m && dy >= 1 && dy <= n)
     44             {
     45                 if(!vis[dx][dy] && str[dx][dy] != '#')
     46                 {
     47                     q_x[tail] = dx;
     48                     q_y[tail++] = dy;
     49                     vis[dx][dy] = true;
     50                     dist[dx][dy] = dist[x][y]+1;
     51                 }
     52             }
     53         }
     54     }
     55 }
     56 
     57 
     58 int Prim()
     59 {
     60     int Ans;
     61     int Min_ele, Min_node;
     62     for(int i = 1; i <= num; i++)
     63     {
     64         dis[i] = INF;
     65     }
     66     Ans = 0;
     67     int r = 1;
     68     for(int i = 1; i <= num-1; i++)
     69     {
     70         Min_ele = INF;
     71         dis[r] = -1;
     72         for(int j = 1; j <= num; j++)
     73         {
     74             if(dis[j] >= 0)
     75             {
     76                 dis[j] = min(dis[j], edge[r][j]);
     77                 if(dis[j] < Min_ele)
     78                 {
     79                     Min_ele = dis[j];
     80                     Min_node = j;
     81                 }
     82             }
     83         }
     84         r = Min_node;
     85         Ans += Min_ele;
     86     }
     87     return Ans;
     88 }
     89 
     90 void Solve()
     91 {
     92     int i, j;
     93     cin >> p;
     94     while(p--)
     95     {
     96         memset(Map, 0, sizeof(Map));
     97         num = 0;
     98         cin >> n >> m;
     99         char s[100];
    100         gets(s);///这里太坑了
    101         for(int i = 1; i <= m; i++)
    102         {
    103             gets(str[i]);
    104             for(int j = 0; j < n; j++)
    105             {
    106                 if(str[i][j] == 'A' || str[i][j] == 'S')
    107                 {
    108                     Map[i][j] = ++num;
    109                 }
    110             }
    111         }
    112         for(int i = 1; i <= m; i++)
    113         {
    114             for(int j = 1; j <= n; j++)
    115             {
    116                 if(Map[i][j])
    117                 {
    118                     BFS(i, j);
    119                 }
    120             }
    121         }
    122         printf("%d
    ", Prim());
    123     }
    124 }
    125 
    126 int main()
    127 {
    128     Solve();
    129 
    130     return 0;
    131 }
    Borg Maze
  • 相关阅读:
    硅谷机场安装第一个咖啡机器人
    美国第一夫人,发推特更新她刚刚装饰好的白宫
    DAO设计模式
    高科技公司名字的由来
    项目管理的经验
    Shanghai InfoSys .NET engineer telephone interview
    {objccn.io}学习笔记-并发编程-常见的后台实践
    升级Xcode7之后VVDocumenter-Xcode不能用的解决办法
    推荐大家看的开发者博客
    iOS8 Layout Margins
  • 原文地址:https://www.cnblogs.com/Silence-AC/p/3532319.html
Copyright © 2020-2023  润新知