意甲冠军:给定一个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 最短路径周围的更多相关文章

  1. Luogu P2864 [USACO06JAN]树林The Grove(bfs)

    P2864 [USACO06JAN]树林The Grove(bfs) 题面 题目描述 The pasture contains a small, contiguous grove of trees t ...

  2. [USACO2006][poj3182]The Grove(巧妙的BFS)

    题目:http://poj.org/problem?id=3182 题意:一个棋盘中间有一个联通块,给你一个起点让你从起点开始绕联通块外围一圈并回到起点,求最小步数. 分析: 首先根据数据的范围比较小 ...

  3. [POJ 3984] 迷宫问题(BFS最短路径的记录和打印问题)

    题目链接:http://poj.org/problem?id=3984 宽度优先搜索最短路径的记录和打印问题 #include<iostream> #include<queue> ...

  4. POJ3182 The Grove[射线法+分层图最短路]

    The Grove Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 904   Accepted: 444 Descripti ...

  5. poj 3182 The Grove bfs

    思路:如果要围绕一圈,必须经过一条竖线上的一点,把竖线左端封住,bfs一次,枚举点,再把竖线右端封住,再bfs回起点. #include <iostream> #include <c ...

  6. 推箱子小游戏《格鲁的实验室》13关 - bfs最短路径

    下载了一款推箱子小游戏,第13关的时候怎么也破不了最佳纪录(最少步数是9而我们最好的方案是10步),因为数据比较小(6*8的方阵),所以写了个BFS来找最短路. 游戏的目标是把小黄人推到黄色球,小绿人 ...

  7. bfs(最短路径)

    http://poj.org/problem?id=3278 Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submis ...

  8. DFS和BFS

    BFS 代码步骤: 1.写出每个点和每个点的邻接点的对应关系 2.方法参数:传一个对应关系和起始点 3.创建一个队列,然后每次都移除第一个,然后把移除的邻接点添加进去,打印取出的第一个,然后循环,一直 ...

  9. 算法导论—无向图的遍历(BFS+DFS,MATLAB)

    华电北风吹 天津大学认知计算与应用重点实验室 最后改动日期:2015/8/22 无向图的存储方式有邻接矩阵,邻接链表,稀疏矩阵等. 无向图主要包括双方面内容,图的遍历和寻找联通分量. 一.无向图的遍历 ...

随机推荐

  1. PHPCMS栏目调用2

    {php $j=1;}                {loop subcat(50) $v}                {php if($v['type']!=0) continue;}     ...

  2. 【python之旅】python简介和入门

    python简介: 一.什么是python python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了打发时间,决心开发一个新的脚本解释程序, ...

  3. Amazon's NoSQL Journey and AWS Operations

    AWS: Amazon Web Services 提供了一整套基础设施和应用程序服务,使您几乎能够在云中运行一切应用程序:从企业应用程序和大数据项目,到社交游戏和移动应用程序. 计算类: EC2:弹性 ...

  4. 2016022603 - redis数据类型

    Redis支持5种类型的数据类型 1.字符串:Redis字符串是字节序列.Redis字符串是二进制安全的,这意味着他们有一个已知的长度没有任何特殊字符终止,所以你可以存储任何东西,512兆为上限.[类 ...

  5. xfire实现webservice客户端之测试关注点

    日前的工作接触到很多系统间的Webservice调用,这里想谈谈基于spring+xfire实现的webservice的客户端踩过的一些坑,需要测试关注的点. xFire的配置项 在spring中实现 ...

  6. [BZOJ 3894] 文理分科 【最小割】

    题目链接:BZOJ - 3894 题目分析 最小割模型,设定一个点与 S 相连表示选文,与 T 相连表示选理. 那么首先要加上所有可能获得的权值,然后减去最小割,即不能获得的权值. 那么对于每个点,从 ...

  7. MacOS快捷键

  8. 改善 ASP.NET MVC 代码库的 5 点建议

    MVC,建议 刚刚检查完支持工单中的一些代码,笔者想针对 ASP.NET MVC 应用的改进写一些建议.这些内容仍在笔者脑海中,愿与各位一同分享.若你已使用 MVC 一段时间,那么以下内容可能并不新鲜 ...

  9. 通过使用CyclicBarrier来计算Matrix中最大的值

    import java.util.Random; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.Exec ...

  10. Android开源项目发现--- 工具类向下兼容篇(持续更新)

    1. ActionBarSherlock 为Android所有版本提供统一的ActionBar,解决4.0以下ActionBar的适配问题 项目地址:https://github.com/JakeWh ...