/*
ID: Jang Lawrence
PROG: maze1
LANG: C++
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#define mp make_pair
using namespace std;
typedef long long lng;
typedef pair<int, int> pii;
int m,n;
int a[301][301];
int dir[][2]={{-1,0},{0,1},{1,0},{0,-1}};
bool is(int x,int y,int d)
{
x=2*x+dir[d][0];
y=2*y+dir[d][1];
return a[x][y]==' ';
}
bool in(int x ,int y)
{
return x>=1&&x<=n&&y>=1&&y<=m;
}
int num[2][110][40];
bool vis[110][40];
pii q[5000];
int kx,ky;
void bfs(int x,int y,int d)
{
memset(vis,0,sizeof(vis));
vis[x][y]=1;
num[d][x][y]=1;
int l=0,r=0;
q[r++]=mp(x,y);
while(l<r)
{
pii v=q[l++];
for(int i=0;i<4;++i)
if(is(v.first,v.second,i)) {
kx=v.first+dir[i][0];
ky=v.second+dir[i][1];
if(in(kx,ky)&&!vis[kx][ky])
{
vis[kx][ky]=1;
q[r++]=mp(kx,ky);
num[d][kx][ky]=num[d][v.first][v.second]+1;
}
}
}
}
int main()
{
#ifndef DEBUG
freopen("maze1.in","r",stdin);
freopen("maze1.out","w",stdout);
#endif
scanf("%d%d\n",&m,&n);
int ans=0;
for(int i=1;i<=2*n+1;++i){
for(int j=1;j<=2*m+1;++j)
a[i][j]=getchar();
getchar();
}
for(int i=2;i<=2*m+1&&ans<2;i+=2)
{
if(a[1][i]==' ')
{
bfs(1,i/2,ans);
ans++;
}
if(a[2*n+1][i]==' ')
{
bfs(n,i/2,ans);
ans++;
}
}
for(int i=2;i<=2*n+1&&ans<2;i+=2)
{
if(a[i][1]==' ')
{
bfs(i/2,1,ans);
ans++;
}
if(a[i][2*m+1]==' ')
{
bfs(i/2,m,ans);
ans++;
}
}
int mans=-10086;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
if(num[0][i][j]>num[1][i][j]&&num[1][i][j]>mans)
{
mans=num[1][i][j];
}
else
if(num[0][i][j]<=num[1][i][j]&&num[0][i][j]>mans)
{
mans=num[0][i][j];
}
printf("%d\n",mans);
return 0;
}
USACO:Overfencing
最新推荐文章于 2017-06-11 22:28:27 发布