poj 1383 Labyrinth【迷宫bfs+树的直径】

Labyrinth

Time Limit: 2000MS   Memory Limit: 32768K
Total Submissions: 4004   Accepted: 1504

Description

The northern part of the Pyramid contains a very large and complicated labyrinth. The labyrinth is divided into square blocks, each of them either filled by rock, or free. There is also a little hook on the floor in the center of every free block. The ACM have found that two of the hooks must be connected by a rope that runs through the hooks in every block on the path between the connected ones. When the rope is fastened, a secret door opens. The problem is that we do not know which hooks to connect. That means also that the neccessary length of the rope is unknown. Your task is to determine the maximum length of the rope we could need for a given labyrinth.

Input

The input consists of T test cases. The number of them (T) is given on the first line of the input file. Each test case begins with a line containing two integers C and R (3 <= C,R <= 1000) indicating the number of columns and rows. Then exactly R lines follow, each containing C characters. These characters specify the labyrinth. Each of them is either a hash mark (#) or a period (.). Hash marks represent rocks, periods are free blocks. It is possible to walk between neighbouring blocks only, where neighbouring blocks are blocks sharing a common side. We cannot walk diagonally and we cannot step out of the labyrinth. 
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

Your program must print exactly one line of output for each test case. The line must contain the sentence "Maximum rope length is X." where Xis the length of the longest path between any two free blocks, measured in blocks.

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;
}

  

时间: 2024-12-14 10:02:59

poj 1383 Labyrinth【迷宫bfs+树的直径】的相关文章

POJ 1383 Labyrinth

Labyrinth Time Limit: 2000ms Memory Limit: 32768KB This problem will be judged on PKU. Original ID: 138364-bit integer IO format: %lld      Java class name: Main The northern part of the Pyramid contains a very large and complicated labyrinth. The la

poj 1985 Cow Marathon 【树的直径】

题目:poj 1985 Cow Marathon 题意:给出一个树,让你求树的直径. 分析: 树的直径:树上两点之间的最大距离. 我们从任意一点出发,BFS一个最远距离,然后从这个点出发,在BFS一个最远距离,就是树的直径. AC代码: /* POJ:1985 Cow Marathon 2014/10/12/21:18 Yougth*/ #include <cstdio> #include <iostream> #include <algorithm> #include

POJ 1985 Cow Marathon【树的直径】

题目大意:给你一棵树,要你求树的直径的长度 思路:随便找个点bfs出最长的点,那个点一定是一条直径的起点,再从那个点BFS出最长点即可 以下研究了半天才敢交,1.这题的输入格式遵照poj1984,其实就是把后面的字母无视即可 2.这题数据量没给,所以把数组开得很大才敢交TUT #include <stdio.h> #include <iostream> #include <string.h> #include <algorithm> #include <

POJ 1849 Two (树形dp 树的直径 两种方法)

Two Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 1232   Accepted: 619 Description The city consists of intersections and streets that connect them. Heavy snow covered the city so the mayor Milan gave to the winter-service a list of st

POJ 3162 Walking Race (树的直径,单调队列)

题意:给定一棵带边权的n个节点的树,首先要求出每个点的最长路,然后写成序列d[1],d[2]...d[n],然后求满足 区间最大值-区间最小值<=k 的最大区间长度为多少? 思路: 分两步进行: (1)最多仅需3次DFS就可以在O(n)时间内求出每个点的最长路了.先从任意点t出发遍历过有点,记录下从点t出发到每个点的最长路,然后从记录的其中一个距t最远的点root出发,再一次DFS,就可以得到离root最远的点e啦,再从e出发DFS一次,就得到所有点的最长路了.注意3次DFS的代码都是一样的喔~

ural 1145 Rope in the Labyrinth 图中 bfs求树的直径

1145. Rope in the Labyrinth Time limit: 0.5 second Memory limit: 64 MB A labyrinth with rectangular form and size m × n is divided into square cells with sides' length 1 by lines that are parallel with the labyrinth's sides. Each cell of the grid is

POJ 1985 Cow Marathon(树的直径)

http://poj.org/problem?id=1985 题意: 有一个树结构, 给你树的全部边(u,v,cost), 表示u和v两点间有一条距离为cost的边. 然后问你该树上最远的两个点的距离是多少?(即树的直径) 分析: 对于树的直径问题, <<算法导论>>(22 2-7)例题有说明. 详细解法: 首先从树上随意一个点a出发, (BFS)找出到这个点距离最远的点b. 然后在从b点出发(BFS)找到距离b点最远的点c. 那么bc间的距离就是树的直径. 证明: 1.    a

poj:1985:Cow Marathon(求树的直径)

Cow Marathon Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 5496   Accepted: 2685 Case Time Limit: 1000MS Description After hearing about the epidemic of obesity in the USA, Farmer John wants his cows to get more exercise, so he has com

poj2631 树的直径 + bfs

1 //Accepted 492 KB 0 ms 2 //树的直径 bfs 3 #include <cstdio> 4 #include <cstring> 5 #include <iostream> 6 #include <queue> 7 using namespace std; 8 const int imax_n = 10005; 9 struct node 10 { 11 int u,v,c; 12 node() 13 { 14 15 } 16 n