poj 1383 Labyrinth【迷宫bfs+树的直径】
| Time Limit: 2000MS | Memory Limit: 32768K | |
| Total Submissions: 4004 | Accepted: 1504 |
Description
Input
The labyrinth is designed in such a way that there is exactly one path between any two free blocks. Consequently, if we find the proper hooks to connect, it is easy to find the right path connecting them.
Output
Sample Input
2
3 3
###
#.#
###
7 6
#######
#.#.###
#.#.###
#.#.#.#
#.....#
#######
Sample Output
Maximum rope length is 0.
Maximum rope length is 8. 题意:一段绳子,可以在迷宫内使用,要求这段绳子可以从迷宫内任意一点到任意的另一点,求绳子的最小长度
题解:求迷宫内最长路径的长度,利用树的直径的求法,进行两次bfs
利用队列记距离:
#include<stdio.h>
#include<string.h>
#include<queue>
#define MAX 1010
using namespace std;
char map[MAX][MAX];
bool vis[MAX][MAX];
int n,m;
int ans,sum,x1,y1,x2,y2;
struct node
{
int x,y;
int ong;
};
void getmap()
{
int i,j;
for(i=0;i<n;i++)
scanf("%s",map[i]);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
if(map[i][j]=='.')
{
x1=i;
y1=j;
return ;
}
}
}
bool judge(int c,int r)
{
if(c>=0&&c<n&&r>=0&&r<m&&map[c][r]!='#'&&!vis[c][r])
return true;
return false;
}
void bfs(int x1,int y1)
{
int i,j;
int move[4][2]={0,1,0,-1,1,0,-1,0};
memset(vis,false,sizeof(vis));
node beg,end;
queue<node>q;
beg.x=x1;
beg.y=y1;
beg.ong=0;
vis[x1][y1]=true;
q.push(beg);
while(!q.empty())
{
end=q.front();
q.pop();
for(i=0;i<4;i++)
{
beg.x=end.x+move[i][0];
beg.y=end.y+move[i][1];
if(judge(beg.x,beg.y))
{
vis[beg.x][beg.y]=true;
beg.ong=end.ong+1;
if(ans<beg.ong)
{
ans=beg.ong;
x2=beg.x;
y2=beg.y;
}
q.push(beg);
}
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
getchar();
scanf("%d%d",&m,&n);
ans=0;
getmap();
bfs(x1,y1);
bfs(x2,y2);
printf("Maximum rope length is %d.\n",ans);
}
return 0;
}
利用dis[]数组记录距离:
#include<stdio.h>
#include<string.h>
#include<queue>
#define MAX 1010
using namespace std;
char map[MAX][MAX];
bool vis[MAX][MAX];
int dis[MAX][MAX];
int n,m;
int ans,sum,x1,y1,x2,y2;
struct node
{
int x,y;
};
void getmap()
{
int i,j;
for(i=0;i<n;i++)
scanf("%s",map[i]);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
if(map[i][j]=='.')
{
x1=i;
y1=j;
return ;
}
}
}
bool judge(int c,int r)
{
if(c>=0&&c<n&&r>=0&&r<m&&map[c][r]!='#'&&!vis[c][r])
return true;
return false;
}
void bfs(int x1,int y1)
{
int i,j;
int move[4][2]={0,1,0,-1,1,0,-1,0};
memset(vis,false,sizeof(vis));
memset(dis,0,sizeof(dis));
node beg,end;
queue<node>q;
beg.x=x1;
beg.y=y1;
vis[x1][y1]=true;
q.push(beg);
while(!q.empty())
{
end=q.front();
q.pop();
for(i=0;i<4;i++)
{
beg.x=end.x+move[i][0];
beg.y=end.y+move[i][1];
if(judge(beg.x,beg.y))
{
vis[beg.x][beg.y]=true;
dis[beg.x][beg.y]=dis[end.x][end.y]+1;
if(ans<dis[beg.x][beg.y])
{
ans=dis[beg.x][beg.y];
x2=beg.x;
y2=beg.y;
}
q.push(beg);
}
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
getchar();
scanf("%d%d",&m,&n);
ans=0;
getmap();
bfs(x1,y1);
bfs(x2,y2);
printf("Maximum rope length is %d.\n",ans);
}
return 0;
}
poj 1383 Labyrinth【迷宫bfs+树的直径】的更多相关文章
- POJ 1383 Labyrinth (bfs 树的直径)
Labyrinth 题目链接: http://acm.hust.edu.cn/vjudge/contest/130510#problem/E Description The northern part ...
- poj 1383 Labyrinth
题目连接 http://poj.org/problem?id=1383 Labyrinth Description The northern part of the Pyramid contains ...
- POJ 1985 Cow Marathon(树的直径模板)
http://poj.org/problem?id=1985 题意:给出树,求最远距离. 题意: 树的直径. 树的直径是指树的最长简单路. 求法: 两遍BFS :先任选一个起点BFS找到最长路的终点, ...
- URAL 1145—— Rope in the Labyrinth——————【求树的直径】
Rope in the Labyrinth Time Limit:500MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64 ...
- poj 1985 Cow Marathon【树的直径裸题】
Cow Marathon Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 4185 Accepted: 2118 Case ...
- codeforce 337D Book of Evil ----树形DP&bfs&树的直径
比较经典的老题 题目意思:给你一颗节点数为n的树,然后其中m个特殊点,再给你一个值d,问你在树中有多少个点到这m个点的距离都不大于d. 这题的写法有点像树的直径求法,先随便选择一个点(姑且设为点1)来 ...
- codeforces 690C2 C2. Brain Network (medium)(bfs+树的直径)
题目链接: C2. Brain Network (medium) time limit per test 2 seconds memory limit per test 256 megabytes i ...
- POJ 1985 Cow Marathon【树的直径】
题目大意:给你一棵树,要你求树的直径的长度 思路:随便找个点bfs出最长的点,那个点一定是一条直径的起点,再从那个点BFS出最长点即可 以下研究了半天才敢交,1.这题的输入格式遵照poj1984,其实 ...
- POJ 1383 Labyrinth (树的直径求两点间最大距离)
Description The northern part of the Pyramid contains a very large and complicated labyrinth. The la ...
随机推荐
- 分布式Web服务器架构(转)
最开始,由于某些想法,于是在互联网上搭建了一个网站,这个时候甚至有可能主机都是租借的,但由于这篇文章我们只关注架构的演变历程,因此就假设这个时候已经是托管了一台主机,并且有一定的带宽了,这个时候由于网 ...
- winform程序中界面的跳转问题
首先是我们进行窗口间的跳转,尤其注意的是winform程序里面的空间都是中线程安全的.但是注意的是如果你在一个线程中操纵另外的控件,这时候会提示你一个错误,这个错误的解决方法准备单独的在另一篇文章中来 ...
- xmlns:tools="http://schemas.android.com/tools"以及tools:context=".ConfActivity"是什么意思
xmlns:tools="http://schemas.android.com/tools"这个是xml的命名空间,有了他,你就可以alt+/作为提示,提示你输入什么,不该输入什么 ...
- ZOJ 3725 Painting Storages(DP+排列组合)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5048 Sample Input 4 3 Sample Output ...
- Cocos2dx边学边总结——开篇(一)
Cocos2dx是一个很好的开源跨平台2d游戏引擎,我们都知道他底层是基于OpenGl ES的,OpenGl 是跨平台的. 正是得益于这点 Cocos2dx的显示部分可以很好的跨平台运作,笔者认为 未 ...
- HTML5 程序设计笔记(一)
HTML5 概述 1.html5 发展史 1993年html首次以因特网草案形式发布. 20世纪90年代,html大幅发展,从2.0版,到3.2版和4.0版.最后到1999年的4.01版. 伴随htm ...
- GridView获取单个单元格的值
0.GridView中的所有数据都存储在Rows集合中,可以通过Rows的Cell属性获取单个单元格的值:如果某个单元格包含其他控件,则通过使用单元格的 Controls 集合,从单元格检索控件:如果 ...
- 好用的自适应表格插件-bootstrap table (支持固定表头)
最近工作中找到了一款十分好用的表格插件,不但支持分页,样式,搜索,事件等等表格插件常有的功能外,最主要的就是他自带的冻结表头功能,让开发制作表格十分容易,不过网上大多都是英文文档,第一次使用会比较麻烦 ...
- Java 不定长度参数
在调用某个方法时,若是方法的参数个数事先无法确定该如何处理?例如System.out.printf()方法中并没有办法事先决定要给的参数个数,像是: ? 1 2 3 System.out.printf ...
- 简单学C——第二天
控制结构(-) 相信大家对流程图肯定很熟悉.下面我将介绍的正是关于此方面的,c语言中,控制结构大体分为选择结构和循环结构. 一.选择结构: 先贴出一般用于选择结构的语 ...