POJ 3026 --Borg Maze(bfs,最小生成树,英语题意题,卡格式)
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 16625 | Accepted: 5383 |
Description
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
Output
Sample Input
2
6 5
#####
#A#A##
# # A#
#S ##
#####
7 7
#####
#AAA###
# A#
# S ###
# #
#AAA###
#####
Sample Output
8
11
Source
题意:给你一个图里面有S和A,让你求把S和A全部连在一起的最少消耗,明着最小生成树,但是每一个S和A之间的距离用bfs求出就行。
主要是题目有个坑,在n,和m后可能会有空行;
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>
using namespace std;
const int INF=0x3f3f3f3f;
char mapp[][];
int a[][];
int n,m;
int dx[]={,-,,};
int dy[]={,,,-};
struct node{
int x,y;
};
int flag[][];
bool vis[];
int minn[];
int cost[][];///记录总的各点到各点的距离
int cnt[][];///记录当前点到bfs到其他各点的距离
void bfs(int sx,int sy){ queue<node>q;
while(!q.empty())q.pop();
memset(cnt,-,sizeof(cnt));
cnt[sx][sy]=;
node first;
first.x=sx,first.y=sy;
q.push(first);
while(!q.empty()){
node now=q.front();
q.pop();
if(a[now.x][now.y]!=-)///记录到全局为生成树做准备
cost[a[sx][sy]][a[now.x][now.y]]=cnt[now.x][now.y];
for(int i=;i<;i++){
node next;
next.x=now.x+dx[i];
next.y=now.y+dy[i];
if(mapp[next.x][next.y]=='#'||cnt[next.x][next.y]!=-||next.x<||next.y<||next.x>=n||next.y>=m)continue;
cnt[next.x][next.y]=cnt[now.x][now.y]+;
q.push(next);
}
}
}
int prim(int n){
int ans=;
memset(vis,false,sizeof(vis));
vis[]=true;
for(int i=;i<n;i++)minn[i]=cost[][i];
for(int i=;i<n;i++){
int minc=INF;
int p=-;
for(int j=;j<n;j++){
if(!vis[j]&&minc>minn[j]){
minc=minn[j];
p=j;
}
}
ans+=minc;
vis[p]=true;
for(int j=;j<n;j++)
if(!vis[j]&&minn[j]>cost[p][j]){
minn[j]=cost[p][j];
}
}return ans;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int t;
cin>>t;
while(t--){
cin>>m>>n;
gets(mapp[]);
memset(a,-,sizeof(a));
int num=;
for(int i=;i<n;i++){
gets(mapp[i]);
for(int j=;j<m;j++){
if(mapp[i][j]=='A'||mapp[i][j]=='S')
a[i][j]=num++;
}
}
/* for(int i=0;i<n;i++){
cout<<mapp[i]<<endl;
}*/
for(int i=;i<n;i++){
for(int j=;j<m;j++){
if(a[i][j]!=-){
bfs(i,j);
}
}
}
/* for(int i=0;i<num;i++){
for(int j=0;j<num;j++){
cout<<cost[i][j]<<" ";
}
cout<<endl;
}*/
cout<<prim(num)<<endl;
}
return ;
}
POJ 3026 --Borg Maze(bfs,最小生成树,英语题意题,卡格式)的更多相关文章
- poj 3026 Borg Maze (bfs + 最小生成树)
链接:poj 3026 题意:y行x列的迷宫中,#代表阻隔墙(不可走).空格代表空位(可走).S代表搜索起点(可走),A代表目的地(可走),如今要从S出发,每次可上下左右移动一格到可走的地方.求到达全 ...
- POJ - 3026 Borg Maze bfs+最小生成树。
http://poj.org/problem?id=3026 题意:给你一个迷宫,里面有 ‘S’起点,‘A’标记,‘#’墙壁,‘ ’空地.求从S出发,经过所有A所需要的最短路.你有一个特殊能力,当走到 ...
- poj 3026 Borg Maze (BFS + Prim)
http://poj.org/problem?id=3026 Borg Maze Time Limit:1000MS Memory Limit:65536KB 64bit IO For ...
- POJ - 3026 Borg Maze BFS加最小生成树
Borg Maze 题意: 题目我一开始一直读不懂.有一个会分身的人,要在一个地图中踩到所有的A,这个人可以在出发地或者A点任意分身,问最少要走几步,这个人可以踩遍地图中所有的A点. 思路: 感觉就算 ...
- POJ 3026 Borg Maze (最小生成树)
Borg Maze 题目链接: http://acm.hust.edu.cn/vjudge/contest/124434#problem/I Description The Borg is an im ...
- poj 3026 Borg Maze(最小生成树+bfs)
题目链接:http://poj.org/problem?id=3026 题意:题意就是从起点开始可以分成多组总权值就是各组经过的路程,每次到达一个‘A'点可以继续分组,但是在路上不能分组 于是就是明显 ...
- poj 3026 Borg Maze bfs建图+最小生成树
题目说从S开始,在S或者A的地方可以分裂前进. 想一想后发现就是求一颗最小生成树. 首先bfs预处理得到每两点之间的距离,我的程序用map做了一个映射,将每个点的坐标映射到1-n上,这样建图比较方便. ...
- POJ 3026 Borg Maze bfs+Kruskal
题目链接:http://poj.org/problem?id=3026 感觉英语比题目本身难,其实就是个最小生成树,不过要先bfs算出任意两点的权值. #include <stdio.h> ...
- POJ - 3026 Borg Maze(最小生成树)
https://vjudge.net/problem/POJ-3026 题意 在一个y行 x列的迷宫中,有可行走的通路空格’ ‘,不可行走的墙’#’,还有两种英文字母A和S,现在从S出发,要求用最短的 ...
随机推荐
- hdu 3496 Watch The Movie (二维背包)
Watch The Movie Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)T ...
- 【C++ 拾遗】Function-like Macros
Macro expansion is done by the C preprocessor at the beginning of compilation. The C preprocessor is ...
- 洛谷 P2387 [NOI2014]魔法森林 解题报告
P2387 [NOI2014]魔法森林 题目描述 为了得到书法大家的真传,小 E 同学下定决心去拜访住在魔法森林中的隐 士.魔法森林可以被看成一个包含 n 个节点 m 条边的无向图,节点标号为 1,2 ...
- linux下搭建redis并解决无法连接redis的问题
以前公司在开发阶段连接的redis一直是正式环境中的,最近老大让我在搭建一个局域网内的redis用于开发阶段时连接使用,搭建过程中也遇到了一些问题,还好已经解决了,在这里记录一下. 首先是搭建redi ...
- jQuery源码分析笔记
jquery-2.0.3.js版本源码分析 (function(){ (21,94) 定义了一些变量和函数 jQuery = function(){}; (96,283) 给JQ对象,添加一些方法 ...
- import pymongo exceptions.ImportError: No module named pymongo
最近用Scrapy写爬虫,将爬取的数据存入Mongodb中,使用的是pymongo这个库,但是运行的时候报错如标题所示 搜了好多网站包括stackoverflow都没有解决,后来发现自己用的是虚拟环境 ...
- Linux下只允许用户远程scp
本文将介绍在Linux环境下,让用户不能远程登录 只能使用scp命令 使用到的软件:rssh(http://pizzashack.org/rssh/index.shtml ) 环境:centos6.x ...
- sublime2创建一个html5的snippets文件
背景:跟了一个网上课程,老师哗啦啦敲代码,屏幕上只敲了几个字,键盘一操作,瞬间一大溜代码,看得我心惊肉跳连忙暂停抄抄抄. 举个简单的例子,我需要创建一个html文件.但是我不想每次都敲固定的格式.那么 ...
- ActiveMQ(2) ActiveMQ创建HelloWorld
启动ActiveMQ: 请参见:ActiveMQ(1) 初识ActiveMQ 创建Maven工程: pom文件: <project xmlns="http://maven.apache ...
- Linux引导过程
早期时,启动一台计算机意味着要给计算机喂一条包含引导程序的纸带,或者手工使用前端面板地址/数据/控制开关来加载引导程序.尽管目前的计算机已经装备了很多工具来简化引导过程,但是这一切并没有对整个过程进行 ...