USACO:Overfencing

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值