用BFS求出每一点到两个出口的最短路径然后再在每个点的路径中找出最长的,这里用的是以出口为起点的BFS。
#include<stdio.h>
#include<fstream>
#include<string.h>
#include<queue>
using namespace std;
struct NODE
{
int x,y,w;
};
NODE node[204][80];
NODE door[2];
char map[204][80];
int dis1[][2]={0,2,0,-2,2,0,-2,0};
int dis2[][2]={0,1,0,-1,1,0,-1,0};
int w,h,d=0,ans=-1;
void BFS()
{
memset(node,0,sizeof(node));
door[0].w=door[1].w=1;
node[door[0].x][door[0].y].w=door[0].w;
node[door[1].x][door[1].y].w=door[1].w;
queue<NODE>q;
NODE now;
q.push(door[0]);
q.push(door[1]);
while(!q.empty())
{
now=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int x=now.x+dis1[i][0];
int y=now.y+dis1[i][1];
int xx=now.x+dis2[i][0];
int yy=now.y+dis2[i][1];
if(map[x][y]==' ' && map[xx][yy]==' ' && x>1 && x<h && y>1 && y<w)
{
if(node[x][y].w==0||node[x][y].w>now.w+1)
{
node[x][y].w=now.w+1;
node[x][y].x=x;
node[x][y].y=y;
q.push(node[x][y]);
}
}
}
}
for(int i=1;i<=h;i++)
for(int j=1;j<=w;j++)
if(ans<node[i][j].w)
ans=node[i][j].w;
}
int main()
{
ofstream fout ("maze1.out",ios::out);
ifstream fin ("maze1.in",ios::in);
fin>>w>>h;
w=w*2+1;
h=h*2+1;
char cc;
fin.get();
for(int i=1;i<=h;i++)
{
for(int j=1;j<=w;j++)
{
map[i][j]=fin.get();
if (i==1&&map[i][j]==' ')
{
door[d].x=i+1;
door[d].y=j;
d++;
}
if (i==h&&map[i][j]==' ')
{
door[d].x=i-1;
door[d].y=j;
d++;
}
if (j==w&&map[i][j]==' ')
{
door[d].x=i;
door[d].y=j-1;
d++;
}
if (j==1&&map[i][j]==' ')
{
door[d].x=i;
door[d].y=j+1;
d++;
}
}
fin.get();
}
BFS();
fout<<ans<<endl;
return 0;
}