这道题的大概意思就是在途中找 两点最远的‘.’
一般我们搜索的时候都是得到 都给点了 起点和终点 这道题没给
而是要最远的两个点
我们可以随便取一个点,然后得到到这个点的最远距离,这样就可以
有一个这样的规律,图中任意一个点到 途中距离最远距离拿那个点一定是 最远的距离中两个点的其中之一
这样就找得到了一个点
再以这个点为起点 bfs 就可以得到结果了
#include<iostream>
#include<queue>
#include<stdio.h>
using namespace std;
int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int sx,sy,n,m;
char map[1000][1000]; //一定记住这是char
int save[1000][1000];
typedef pair<int ,int > PAIR;
int INF=-10000;
int Max[2],max_step=-1;
void bfs()
{
queue <PAIR> q_ue;
q_ue.push(PAIR(sy,sx));
for(int i=0;i<1000;i++)
{
for(int j=0;j<1000;j++)
{
save[i][j]=INF;
}
}
save[sy][sx]=0;
while(q_ue.size())
{
PAIR p=q_ue.front();
q_ue.pop();
for(int i=0;i<4;i++)
{
int x=p.second+dir[i][0],y=p.first+dir[i][1];
if(x>=0 && x<m &&y>=0 && y<n && save[y][x] ==INF && map[y][x]!='#')
{
q_ue.push(PAIR(y,x));
save[y][x]=save[p.first][p.second]+1;
if(save[y][x]>max_step)
{
max_step=save[y][x];
Max[0]=y;
Max[1]=x;
}
}
}
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
max_step=-1;
scanf("%d%d",&m,&n);
for(int i=0; i<n; i++)
{
scanf("%s",map[i]);//得到地图信息
for(int j=0; j<m; j++) //得到地图开始位置和结束位置的值
{
if(map[i][j]=='.')
{
sx=j;
sy=i;
}
}
}
bfs();
sx=Max[1],sy=Max[0];
bfs();
if(max_step==-1)
cout<<"Maximum rope length is 0."<<endl;
else
cout<<"Maximum rope length is "<<max_step<<"."<<endl;
}
return 0;
}
/*
2
7 6
#######
#.#.###
#.#.#.#
#.#.#.#
#.....#
#######
3 3
.#.
.#.
#..
*/