【POJ3182】The Grove BFS 最短路径周围
意甲冠军:给定一个N*M图。,间‘X’代表树木(树木必须汇集到森林,非分离),然后,‘.’它代表的空间。‘*’它代表的起点。现在它需要从起点。一圈,最后回到起点,所经过最少点数。
题目中给的‘+’就是当中一种最短路径。
题解:随便找一条经过森林且不经过起点的直线,可证路径一定会穿过这条直线。那么就在这条直线上枚举一个点,做两遍BFS,求其从分别直线两側出发到起点的最短距离。
在这里说一个推断边界的简单方法,就是先给图里每一个点打上标记。详见代码里‘in’数组。in值为0的自然就不再里面,而没有必要推断什么“1<=x&&x<=n&&……”。
好了,贴代码。
#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 55
#define inf 0x3f3f3f3f
using namespace std;
const int dx[8]={-1,-1,-1,0,0,1,1,1};
const int dy[8]={-1,0,1,-1,1,-1,0,1};
struct Lux
{
int x,y;
Lux(int a,int b):x(a),y(b){}
Lux(){}
};
char mp[N][N];
int map[N][N];/*0可行,1森林,2枚举线段,3起点*/
int n,m,ans=inf;
int dist[N][N],tx,ty; int in[N][N],cnt;
queue<Lux>q;
int bfs(int sx,int sy)
{
int i,fr,ret;
int vx,vy; for(ret=fr=0;fr<2;fr++)
{
memset(dist,0x3f,sizeof(dist));
while(!q.empty())q.pop();
for(i=fr*5;i<fr*5+3;i++)
{
vx=sx+dx[i];
vy=sy+dy[i];
if(in[vx][vy]&&!map[vx][vy])dist[vx][vy]=1,q.push(Lux(vx,vy));
}
while(!q.empty())
{
Lux U=q.front();q.pop();
for(i=0;i<8;i++)
{
vx=U.x+dx[i];
vy=U.y+dy[i];
if(in[vx][vy]&&!map[vx][vy]&&dist[vx][vy]>dist[U.x][U.y]+1)
{
dist[vx][vy]=dist[U.x][U.y]+1;
q.push(Lux(vx,vy));
}
}
}
ret+=dist[tx][ty];
}
return ret;
}
int main()
{
// freopen("test.in","r",stdin);
int i,j,x,y;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)scanf("%s",mp[i]+1);
for(j=1;j<=m;j++)for(i=1;i<=n;i++)
{
in[i][j]=++cnt;
if(mp[i][j]=='X')
{
map[i][j]=1;
x=i;y=j;
}
else if(mp[i][j]=='*')tx=i,ty=j;
}
if(tx==x&&ty>y)
{
for(i=y;mp[x][i]=='X';i--);
y=i;
for(i=y;i;i--)map[x][i]=3;
for(i=y;i;i--)ans=max(ans,bfs(x,i));
}
else
{
for(i=y+1;i<=m;i++)map[x][i]=3;
for(i=y+1;i<=m;i++)ans=min(ans,bfs(x,i));
}
printf("%d\n",ans);
return 0;
}
版权声明:本文博主原创文章,博客,未经同意不得转载。
【POJ3182】The Grove BFS 最短路径周围的更多相关文章
- Luogu P2864 [USACO06JAN]树林The Grove(bfs)
P2864 [USACO06JAN]树林The Grove(bfs) 题面 题目描述 The pasture contains a small, contiguous grove of trees t ...
- [USACO2006][poj3182]The Grove(巧妙的BFS)
题目:http://poj.org/problem?id=3182 题意:一个棋盘中间有一个联通块,给你一个起点让你从起点开始绕联通块外围一圈并回到起点,求最小步数. 分析: 首先根据数据的范围比较小 ...
- [POJ 3984] 迷宫问题(BFS最短路径的记录和打印问题)
题目链接:http://poj.org/problem?id=3984 宽度优先搜索最短路径的记录和打印问题 #include<iostream> #include<queue> ...
- POJ3182 The Grove[射线法+分层图最短路]
The Grove Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 904 Accepted: 444 Descripti ...
- poj 3182 The Grove bfs
思路:如果要围绕一圈,必须经过一条竖线上的一点,把竖线左端封住,bfs一次,枚举点,再把竖线右端封住,再bfs回起点. #include <iostream> #include <c ...
- 推箱子小游戏《格鲁的实验室》13关 - bfs最短路径
下载了一款推箱子小游戏,第13关的时候怎么也破不了最佳纪录(最少步数是9而我们最好的方案是10步),因为数据比较小(6*8的方阵),所以写了个BFS来找最短路. 游戏的目标是把小黄人推到黄色球,小绿人 ...
- bfs(最短路径)
http://poj.org/problem?id=3278 Catch That Cow Time Limit: 2000MS Memory Limit: 65536K Total Submis ...
- DFS和BFS
BFS 代码步骤: 1.写出每个点和每个点的邻接点的对应关系 2.方法参数:传一个对应关系和起始点 3.创建一个队列,然后每次都移除第一个,然后把移除的邻接点添加进去,打印取出的第一个,然后循环,一直 ...
- 算法导论—无向图的遍历(BFS+DFS,MATLAB)
华电北风吹 天津大学认知计算与应用重点实验室 最后改动日期:2015/8/22 无向图的存储方式有邻接矩阵,邻接链表,稀疏矩阵等. 无向图主要包括双方面内容,图的遍历和寻找联通分量. 一.无向图的遍历 ...
随机推荐
- webapp框架—学习AngularUI1(demo折腾)
angularUI下载地址:https://github.com/Clouda-team/BlendUI 下载解压后,demo在根目录 现在测试官网demo的使用 用浏览器打开mobile-angul ...
- swift官方文档中的switch中case let x where x.hasSuffix("pepper")是什么意思?
在官方文档中,看到这句.但不明白什么意思. let vegetable = "red pepper" switch vegetable { case "celery&qu ...
- Mac Pro的HDMI接口与WI-FI可能存在冲突的解决方法
当我将Mac Pro通过HDMI->DVI转接头接上一台显示器时,正在使用的WI-FI网络立马不能使用,重新连接网络也不行,但断开HDMI连接后,WI-FI立马恢复正常. 在网上查,在apple ...
- C# mvc 验证码2
public class ValidateCode { /// <summary> /// 產生圖形驗證碼. /// </su ...
- Label设置行间距--b
内容摘要 UILabel显示多行文本 UILabel设置行间距 解决单行文本 & 多行文本显示的问题 场景描述 众所周知,UILabel显示多行的话,默认行间距为0,但实际开发中,如果显示多行 ...
- 程序集“xxx"中的类型"xxx"的方法“XXXX”没有实现
通过反射调用一个类库时出现这样的报错,检查了一下类中已经实现了此方法,实现的方法如下: public partial class LogList : DockContent, ILogForm { p ...
- HTML文档模式与盒模型
HTML文档根据文档顶部的doctype声明来决定渲染模式,有标准模式(Standards Mode)与怪异模式(Quirks mode,或叫做混杂模式)两种模式. IE5及以前默认总是表现为怪异模式 ...
- jquery实现表格可变列宽插件开发
工作中用到了表格的可变列宽,网上看了下,自己也实现了一个,整理贴记录. 测试环境chrome,ie8,firefox jquery版本1.8.2 原理:监听table第一行的mousemove事件,当 ...
- 【Itext】解决Itext5大并发大数据量下输出PDF发生内存溢出outofmemery异常
尼玛,这个问题干扰了我两个星期!! 关键字 itext5 outofmemery 内存溢出 大数据 高并发 多线程 pdf 导出 报表 itext 并发 在读<<iText in Acti ...
- 用Robotium 去实现点击imageview
今天用rototium做自动化遇到imageview无法点击的问题,最终解决如下: 有两种方法: 1.View v = solo.getView(R.id.iv_main_setting); ...