POJ 3026 Borg Maze「建议收藏」

POJ 3026 Borg Maze

大家好,又见面了,我是全栈君。

Borg Maze
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 7998   Accepted: 2675

Description

The Borg is an immensely powerful race of enhanced humanoids from the delta quadrant of the galaxy. The Borg collective is the term used to describe the group consciousness of the Borg civilization. Each Borg individual is linked to the collective by a sophisticated subspace network that insures each member is given constant supervision and guidance. 

Your task is to help the Borg (yes, really) by developing a program which helps the Borg to estimate the minimal cost of scanning a maze for the assimilation of aliens hiding in the maze, by moving in north, west, east, and south steps. The tricky thing is that the beginning of the search is conducted by a large group of over 100 individuals. Whenever an alien is assimilated, or at the beginning of the search, the group may split in two or more groups (but their consciousness is still collective.). The cost of searching a maze is definied as the total distance covered by all the groups involved in the search together. That is, if the original group walks five steps, then splits into two groups each walking three steps, the total distance is 11=5+3+3.

Input

On the first line of input there is one integer, N <= 50, giving the number of test cases in the input. Each test case starts with a line containg two integers x, y such that 1 <= x,y <= 50. After this, y lines follow, each which x characters. For each character, a space “ ” stands for an open space, a hash mark “#” stands for an obstructing wall, the capital letter “A” stand for an alien, and the capital letter “S” stands for the start of the search. The perimeter of the maze is always closed, i.e., there is no way to get out from the coordinate of the “S”. At most 100 aliens are present in the maze, and everyone is reachable.

Output

For every test case, output one line containing the minimal cost of a succesful search of the maze leaving no aliens alive.

Sample Input

2
6 5
##### 
#A#A##
# # A#
#S  ##
##### 
7 7
#####  
#AAA###
#    A#
# S ###
#     #
#AAA###
#####  

Sample Output

8
11

最小生成树问题,主要是要求出点点距离,即字母间边权。这里用BFS求出了边权,用prim算法求出了最小生成树路径。

AC代码例如以下:

<pre name="code" class="cpp">#include<iostream>
#include<queue>
#include<cstring>
#include<cstdio>
#define inf 100000
using namespace std;

char map[60][60];
int vis[60][60],v[60][60];
int n,m,tt,ans;
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};

struct H
{
    int h,z;
}a[10005];

int w[251][251],lc[251],vv[60][60];//W是边权记录,LCprim算法运用,VV记录第几个字母的坐标
struct HH
{
    int h,z,st;
};

int bfs(int h,int z)
{
    int i;
    v[h][z]=1;
    queue <HH> q;
    HH a,b,c;
    a.h=h;
    a.z=z;
    a.st=0;
    q.push(a);
    while(!q.empty())
    {
        b=q.front();
        q.pop();
        if(vv[b.h][b.z])//统计边权
            {
                w[vv[h][z]][vv[b.h][b.z]]=b.st;
                w[vv[b.h][b.z]][vv[h][z]]=b.st;
                //cout<<vv[h][z]<<" "<<vv[b.h][b.z]<<" "<<b.st<<endl;
            }

        for(i=0;i<4;i++)
        {
            c.h=b.h+dx[i];
            c.z=b.z+dy[i];
            if(c.h>=0&&c.h<n&&c.z>=0&&c.z<m&&map[c.h][c.z]!='#'&&!v[c.h][c.z])
            {
                v[c.h][c.z]=1;
                c.st=b.st+1;
                q.push(c);
            }
        }
    }
}

void prim()
{
    int i,j;
    int m,id;
    for(i=1;i<tt;i++)
    {
        lc[i]=w[1][i];
    }

    lc[1]=0;
    for(j=1;j<tt-1;j++)
    {
        m=inf;
        for(i=1;i<tt;i++)
        if(lc[i]!=0&&lc[i]<m)
        {m=lc[i];id=i;}
        ans+=m;
        lc[id]=0;
        for(i=1;i<tt;i++)
        {
            if(lc[i]!=0&&lc[i]>w[id][i])
                lc[i]=w[id][i];
        }
    }

}

int main()
{
    int i,j,l;
    int t;
    char c[10];
    scanf("%d",&t);
    gets(c);
    while(t--)
    {
        tt=1;
        memset(vis,0,sizeof vis );
        cin>>m>>n;
        gets(c);
        for(i=0;i<n;i++)
            gets(map[i]);
        //for(i=0;i<n;i++)
            //cout<<map[i]<<endl;
        int bj=0;
        memset(vv,0,sizeof vv);
        for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
            if(map[i][j]=='A'||map[i][j]=='S')
            {
                vv[i][j]=tt++;//记录字母序号及个数
            }
        }
        for(i=1;i<tt;i++)
            for(j=1;j<=i;j++)
                if(i==j)
                w[i][j]=0;
                else {
                    w[i][j]=inf;
                    w[j][i]=inf;
                }
        for(i=0;i<n;i++)
            for(j=0;j<m;j++)
            {
                if((map[i][j]=='A'||map[i][j]=='S')&&!vis[i][j])
                {
                    vis[i][j]=1;
                    memset(v,0,sizeof v);
                    bfs(i,j);//求出这个字母到各个字母产生的边权
                }

            }

        ans=0;
        prim();//prim算法的运用
        cout<<ans<<endl;
    }
    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115412.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 玩玩三维重建–Visual SFM介绍

    玩玩三维重建–Visual SFM介绍转自:  奇点视觉        原文地址玩玩三维重建Leaveareply版权声明:本文系本站作者自己翻译整理,欢迎转载,但转载请以超链接形式注明文章来源(planckscale.info)、作者信息和本声明,否则将追究法律责任。我们在实时三维重建方面的工作今年已经密集展开。或许不久后某一天,你会在本站看到带有SLA

    2022年6月20日
    101
  • 基于Spring MVC + Spring + MyBatis的【密室逃脱游戏主题排行榜】

    基于Spring MVC + Spring + MyBatis的【密室逃脱游戏主题排行榜】一、语言和环境实现语言:Java语言环境要求:eclipse/myeclipse/idea、maven、mysql使用技术:Spring、SpringMVC、MyBatis、连接池和json包自行选择二、实现功能密室逃脱游戏越来越受年轻人的喜欢,现在将各地密室游戏主题进行排名,评选2021年度最受玩家喜欢的密室主题。说明:下列界面样式仅供参考,实际完成效果美观合理即可。1.显示数据:根据图1格式,显示t_games表中所有的数据,并且按照【票数】列进行降序排序,其实【主题种类】一列在t_g

    2022年5月10日
    41
  • goland 激活码2021(破解版激活)

    goland 激活码2021(破解版激活),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月17日
    472
  • word2007在试图打开文件时遇到错误解决方法「建议收藏」

    word2007在试图打开文件时遇到错误解决方法「建议收藏」当您尝试在MicrosoftOfficeWord2007中打开.docx文件时,该文件打不开。此外,您还会收到以下错误消息:Word在试图打开文件时遇到错误。请尝试下列方法:*检查文档或驱动器的文件权限。*确保有足够的内存和磁盘空间。*用文本恢复转换器打开文件。原因发生此问题的原因是由于恢复文档被保存为扩展名为.docx的自动保存文档(*.asd)文件。…

    2022年5月30日
    484
  • 华硕笔记本电脑怎么重装系统_华硕笔记本 重装系统

    华硕笔记本电脑怎么重装系统_华硕笔记本 重装系统原标题:超详细华硕笔记本电脑重装系统图文教程重装系统难吗?不难,难的是你不愿意尝试迈出第一步。今天给大家分享的是超详细华硕笔记本电脑重装系统图文教程,通过使用小白一键重装系统工具可以让我们快速的了解并使用在线重装系统方式来完成Windows10系统安装。小白一键重装系统在线重装Windows10系统步骤:1、百度搜索小白系统官网访问官网并下载小白一键重装系统软件打开。2、在选择系统列…

    2022年8月12日
    5
  • TD-SCDMA的优势「建议收藏」

    TD-SCDMA的优势「建议收藏」TD-SCDMA的优势  第二代移动通信系统(2G)(如GSM和IS-95)利用成对频带,通过上下行链路,以FDD模式运行。这些系统的设计只适用于数字化话音和低比特率数据的传输,不能满足多媒体和高比特率数据业务中宽带数据传输量不断增长的需求。第三代移动通信系统(3G)可支持高话音容量和高比特率非对称业务,以及移动无线因特网业务。它的主要特征在于可向网络运营商提供最佳频谱效率和经济效益。对运营商来讲

    2022年10月3日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号