POJ 3026 Borg Maze 广搜(BFS)+最小生成树
题意:从S出发,去抓每一个A,求总路径最短长度。在S点和A点人可以分身成2人,不过一次只能让一个人走。
思路是先利用BFS求出各点之间的距离,建成图,再套用最小生成树模板。
一次性A了。不过觉得在判断第几个编号的点时稍显麻烦了。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std; const int inf=1000000;
const int maxn=205;
char mapp[maxn][maxn];
bool visit[maxn][maxn];
bool vis[maxn];
int dx[]= {-1,0,1,0}; //四个方向
int dy[]= {0,-1,0,1};
int mat[maxn][maxn],dis[maxn];
int cou,ans; struct Node
{
int x;
int y;
int s; //记录距离
int num; //点的编号
} next,nodes[maxn]; //nodes[]存所有的点
void bfs(Node node,int a)
{
memset(visit,0,sizeof(visit));
node.s=0;
mapp[node.y][node.x]=' '; //访问过后将'S'或'A'变成' ',下次不需重复访问
queue<Node>q;
visit[node.x][node.y]=true;
q.push(node);
while(!q.empty())
{
node=q.front();
if(mapp[node.y][node.x]=='A')
{
if(a==0)
{
nodes[cou]=node;
mat[a][cou]=mat[cou][a]=node.s;
cou++; //记录有多少个点
}
else
{
int b;
for(int j=0;; j++)
if(nodes[j].x==node.x && nodes[j].y==node.y)
{
b=nodes[j].num;
break;
}
mat[a][b]=mat[b][a]=node.s; //将距离写入对角矩阵
}
}
q.pop();
for(int i=0; i<4; i++)
{
next=node;
next.x=node.x+dx[i];
next.y=node.y+dy[i];
if(!visit[next.x][next.y] && (mapp[next.y][next.x]==' ' || mapp[next.y][next.x]=='A'))
{
visit[next.x][next.y]=true;
next.s=node.s+1;
q.push(next); }
}
}
return ;
}
bool prim()
{
memset(vis,0,sizeof(vis));
for(int i=0;i<cou;i++)
dis[i]=(i==0? 0:inf);
ans=0;
for(int i=0;i<cou;i++)
{
int temp=inf,k=0;
for(int j=0;j<cou;j++)
{
if(!vis[j] && dis[j]<temp )
{
temp=dis[j];
k=j;
}
}
if(temp==inf)
return false;
vis[k]=true;
ans+=temp;
for(int j=0;j<cou;j++)
{
if(!vis[j] && dis[j]>mat[k][j])
dis[j]=mat[k][j];
}
}
return true;
}
int main()
{
//freopen("in.txt","r",stdin);
int n;
scanf("%d",&n);
while(n--)
{
int x,y;
memset(mapp,0,sizeof(mapp));
scanf("%d%d",&x,&y);
char c[maxn]={0};
gets(c);
for(int i=0; i<y; i++)
gets(mapp[i]);
for(int i=0; i<x; i++)
for(int j=0; j<y; j++)
if(mapp[i][j]=='S')
{
nodes[0].y=i;
nodes[0].x=j;
}
bool flag=true;
cou=1;
for(int i=0; i<cou; i++)
{
bfs(nodes[i],i);
if(flag)
{
for(int j=0; j<cou; j++)
nodes[j].num=j; //给各个点编号,只运行一次
flag=false;
}
}
prim();
printf("%d\n",ans);
}
return 0;
}
POJ 3026 Borg Maze 广搜(BFS)+最小生成树的更多相关文章
- POJ 3026 Borg Maze(Prim+bfs求各点间距离)
题目链接:http://poj.org/problem?id=3026 题目大意:在一个y行 x列的迷宫中,有可行走的通路空格’ ‘,不可行走的墙’#’,还有两种英文字母A和S,现在从S出发,要求用 ...
- POJ 3026 Borg Maze(Prim+BFS建邻接矩阵)
( ̄▽ ̄)" #include<iostream> #include<cstdio> #include<cstring> #include<algo ...
- 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 最小生成树 + 广搜
点击打开链接 Borg Maze Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7097 Accepted: 2389 ...
- POJ 3026 Borg Maze【BFS+最小生成树】
链接: http://poj.org/problem?id=3026 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22010#probl ...
- POJ - 3026 Borg Maze BFS加最小生成树
Borg Maze 题意: 题目我一开始一直读不懂.有一个会分身的人,要在一个地图中踩到所有的A,这个人可以在出发地或者A点任意分身,问最少要走几步,这个人可以踩遍地图中所有的A点. 思路: 感觉就算 ...
- POJ 3026 Borg Maze(bfs+最小生成树)
Borg Maze Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6634 Accepted: 2240 Descrip ...
- poj 3026 Borg Maze (bfs + 最小生成树)
链接:poj 3026 题意:y行x列的迷宫中,#代表阻隔墙(不可走).空格代表空位(可走).S代表搜索起点(可走),A代表目的地(可走),如今要从S出发,每次可上下左右移动一格到可走的地方.求到达全 ...
- 快速切题 poj 3026 Borg Maze 最小生成树+bfs prim算法 难度:0
Borg Maze Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8905 Accepted: 2969 Descrip ...
随机推荐
- 060.Python组件-中间件
一 中间件基本介绍 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好会 ...
- Linux服务之Samba服务篇
Samba服务 桑巴Smb是基于cs架构 作用:用于跨平台进行文件共享 优点:兼容性好,较为安全(具备身份验证) 缺点:仅限内网环境使用 应用:一般在办公环境下使用 rz 也是一种可以在Windows ...
- docker命令补全
安装docker自带包: source /usr/share/bash-completion/completions/docker 缺少下面的包,TAB会报错 yum install -y bash- ...
- STM32F4-IAP学习笔记--(转)
花了断断续续两天时间在STM32上面写了一个IAP(In Application Programing)Boot,期间多多少少还是遇到的了不少问题.现在就花点时间把这两天写的东西整理一下,就当是学习笔 ...
- 离散傅里叶变换的衍生,负频率、fftshift、实信号、共轭对称
封面是福州的福道,从高处往下看福道上的人在转圈圈.从傅里叶变换后的频域角度来看,我们的生活也是一直在转圈圈,转圈圈也是好事,说明生活有规律,而我们应该思考的是,如何更有效率地转圈圈--哦别误会,我真不 ...
- Step By Step(Lua表达式和语句)
Step By Step(Lua表达式和语句) 一.表达式: 1. 算术操作符: Lua支持常规算术操作符有:二元的"+"."-"."*& ...
- SparkCore之业务操作逻辑
在上spark的时候,一开始需要虚拟机模拟真实环境,而spark主要的三种模式:local.standalone.yarn 均可以通过虚拟机模拟. 这里要讨论的是业务逻辑如何和 spark 结合,具体 ...
- 调试动态加载的js
用浏览器无法调试异步加载页面里包含的js文件.简单的说就是在调试工具里面看不到异步加载页面里包含的js文件 最近在一个新的web项目中开发功能.这个项目的管理界面有一个特点,框架是固定的,不会刷新 ...
- 华为4D成像雷达、智能驾驶平台MDC 810
华为4D成像雷达.智能驾驶平台MDC 810 2020年10月底,华为发布了HI品牌,在今年2021年上海国际车展前夕,华为以 "专新致智" 为主题,举办HI新品发布会,发布了包括 ...
- 用NVIDIA A100 GPUs提高计算机视觉
用NVIDIA A100 GPUs提高计算机视觉 Improving Computer Vision with NVIDIA A100 GPUs 在2020年英伟达GPU技术会议的主题演讲中,英伟达创 ...