// usaco-Overfencing /* * 类型:搜索 * 求最远距离的最少步数,用宽度优先搜索 * 记录 两个出口位置 * !!!两个出口要同时搜索(每个点都要选择最近的出口) * !!!输出时分情况,按搜索最后一个节点的位置分(墙||空地) * 数据: * 3 3 * +-+-+-+ * | | * + + + + * | | | * +-+-+ + * | | * +-+ +-+ */ #include <iostream> #include <fstream> #include <cstring> #include <string> #include <queue> using namespace std; #define MAXN 210 bool vis[MAXN][MAXN]; int sx[2],sy[2],dir[4][2]={-1,0,1,0,0,-1,0,1}; int N,H,W; struct node{int xx,yy;}p1,tmp; string a[MAXN]; ifstream fin("maze1.in"); ofstream fout("maze1.out"); bool is_in(int x,int y) { if(x>1 && y>1 && x<H && y<W) return true; return false; } int bfs(int x,int y,int x1,int y1) { int i,j,k,dist,num=0; int dis[2]={1,1}; queue<node> q; p1.xx=x; p1.yy=y; vis[x][y]=true; q.push(p1); p1.xx=x1; p1.yy=y1; vis[x1][y1]=true; q.push(p1); while(!q.empty()){ num++; for(j=0; j!=2; ++j) for(dist=dis[j],dis[j]=i=0; i!=dist; ++i){ p1=q.front(); q.pop(); for(k=0; k<4; ++k){ tmp.xx=p1.xx+dir[k][0]; tmp.yy=p1.yy+dir[k][1]; if(!vis[tmp.xx][tmp.yy] && is_in(tmp.xx,tmp.yy) && a[tmp.xx][tmp.yy]==' '){ vis[tmp.xx][tmp.yy]=true; dis[j]++; q.push(tmp); } } } } return num; } void init() { int i,j,k=0; fin>>W>>H; H=2*H+1; W=2*W+1; for(getline(fin,a[0]),i=1; i<=H; ++i){ getline(fin,a[i]); a[i]=' '+a[i]; } for(i=1; i<=H; ++i) for(j=1; j<=W; ++j){ if((i==1 || i==H || j==1 || j==W) && a[i][j]==' '){ sx[k]=i; sy[k]=j; (i==1 || i==H) ? (i==1 ? sx[k]++ : sx[k]--) : (j==1 ? sy[k]++ : sy[k]--); k++; } } } int main(void) { init(); int num=bfs(sx[0],sy[0],sx[1],sy[1]); if((p1.xx&1) || (p1.yy&1)) fout<<num/2<<endl; else fout<<num/2+1<<endl; return 0; }