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 ...
随机推荐
- C++知识点案例 笔记-6
1.三种友元函数 -非模板友元函数 -约束模板友元函数 -非约束模板友元函数 2.非类型参数 3.模板特化 1.三种友元函数 =====三种友元函数===== --1---非模板友元函数 #inclu ...
- 042.Python进程队列介绍
进程队列介绍 1 基本语法及过程 先进先出,后进后出,q = Queue() 过程 (1)把数据放到q队列中 put (2)把书局从队列中拿出来 get from multiprocessing i ...
- strcasecmp函数和strncasecmp函数原型
函数说明 strcasecmp()用来比较参数s1和s2字符串,比较时会自动忽略大小写的差异. 返回值 若参数s1和s2字符串相同则返回0.s1长度大于s2长度则返回大于0 的值,s1 长度若小 ...
- docker-ce 安装
配置源 确认版本 添加镜像加速器 https://docs.docker.com/engine/release-notes/19.03/ for centos wget -O /etc/yum.rep ...
- System Verilog过程块和方法
- Nginx限制访问速率和最大并发连接数模块--limit
Nginx限制访问速率和最大并发连接数模块--limit Tengine版本采用http_limit_req_module进行限制 具体连接请参考 http://tengine.taobao.org/ ...
- Python+Selenium - 一个元素有两个标签时:一个用于显示,一个用于底层
如下图,这种一个元素由两个标签控制的,用js改值时需要两个标签的属性值都改 改值代码 js_code = 'a = document.getElementById("lostdate&quo ...
- 自动驾驶传感器比较:激光雷达(LiDAR) vs. 雷达(RADAR)
自动驾驶传感器比较:激光雷达(LiDAR) vs. 雷达(RADAR) 据麦姆斯咨询报道,2032年全球范围内自动驾驶汽车的产量将高达2310万辆,未来该市场的复合年增长率(CAGR)高达58%.届时 ...
- 深度学习编译与优化Deep Learning Compiler and Optimizer
深度学习编译与优化Deep Learning Compiler and Optimizer
- 旷视MegEngine基本概念
旷视MegEngine基本概念 MegEngine 是基于计算图的深度神经网络学习框架. 本文简要介绍计算图及其相关基本概念,以及它们在 MegEngine 中的实现. 计算图(Computation ...