| input | output |
|---|---|
7 6 ####### #.#.### #.#.### #.#.#.# #.....# ####### |
8 |
首先我们要知道怎么求树的直径。
树的直径是指树的最长简单路。
求法: 两遍BFS :先任选一个起点BFS找到最长路的终点,再从终点进行BFS,则第二次BFS找到的最长路即为树的直径;
题意:给了个图,‘ . ‘ 可以走 ‘ # ’ 是墙。因为题目中规定了两点之间最多只有一条路可以走,而且必有一条路。可以见‘ . ’ 是一个树的结构。要求得距离最长的两点的距离。也就是求树的直径了。
做法: 找到节点,节点就是三面有‘ # ‘ 的 点。然后bfs 两遍求出直径就可以了。
注意:图很大,dfs 会超内存。
#include<stdio.h>
#include<iostream>
#include<string>
#include<map>
#include<queue>
using namespace std;
int dir[4][2]={1,0,-1,0,0,1,0,-1};
char mp[830][830];
int ans;
int n,m;
int bix;
int biy;
int pp;
struct nodes
{
int x,y,num,ff;
};
nodes now,tem;
bool ok(int a,int b)
{
if(a==0&&b==1)
return 0;
if(a==1&&b==0)
return 0;
if(a==2&&b==3)
return 0;
if(a==3&&b==2)
return 0;
return 1;
}
void bfs(int x,int y)
{
queue<nodes>q;
now.ff=-1;
now.num=0;
now.x=x;
now.y=y;
q.push(now);
while(!q.empty())
{
now=q.front();
q.pop();
if(now.num>ans)
{
bix=now.x;
biy=now.y;
ans=now.num;
}
int xx,yy;
for(int i=0;i<4;i++)
{
xx=now.x+dir[i][0];
yy=now.y+dir[i][1];
if(xx>=0&&xx<n&&yy>=0&&yy<m&&mp[xx][yy]=='.'&&ok(i,now.ff))
{
tem.x=xx;
tem.y=yy;
tem.num=now.num+1;
tem.ff=i;
q.push(tem);
}
}
}
}
int main()
{
while(scanf("%d%d",&m,&n)!=EOF)
{
ans=0;
for(int i=0;i<n;i++)//mp[n][m]
scanf("%s",mp[i]);
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(mp[i][j]=='.')
{
int num=0;
for(int k=0;k<4;k++)
{
int xx=i+dir[k][0];
int yy=j+dir[k][1];
if(xx>=0&&xx<n&&yy>=0&&yy<m)
{
if(mp[xx][yy]=='.')
num++;
}
}
if(num==1)
pp=i*m+j;
}
}
}
bfs(pp/m,pp%m);
bfs(bix,biy);
printf("%d\n",ans);
}
return 0;
}
ural 1145 Rope in the Labyrinth 图中 bfs求树的直径
原文地址:http://blog.csdn.net/u013532224/article/details/43760039