#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define maxs 13
#define maxsize 100000
int length=0;
int visit[20][20];
char mg[maxs][maxs];
typedef struct queue //huojiedian
{
int rear;
int top;
int base[maxsize][2];//0==x 1==y
} queue;
void enqueue(queue *a,int m,int n) //top wuyuansu {
if((a->top+1)%maxsize!=a->rear)
{
a->base[a->top][0]=m;
a->base[a->top][1]=n;
a->top=(a->top+1)%maxsize;
}
}
void dequeue(queue *a,int *x,int *y)
{
if(a->rear!=a->top)
{
*x=a->base[a->rear][0];
*y=a->base[a->rear][1];
a->rear=(a->rear+1)%maxsize;
}
}
int empty(queue *a)
{
if(a->rear==a->top)
return 0;
return 1;
}
int search(int x,int y,int m,int n,queue *a,char mg[13][13])
{
while(1)
{
if(empty(a))
{
dequeue(a,&x,&y);
if(x==0&&y==0)
{
enqueue(a,0,0);
length++;
dequeue(a,&x,&y);
}
visit[x][y]=1;
if(x==m&&y==n)
return 0;
if(mg[x-1][y]!='X'&&x-1>0&&visit[x-1][y]==0) //UP
enqueue(a,x-1,y);
if(mg[x][y+1]!='X'&&y+1<maxs&&visit[x][y+1]==0) //RIGHT
enqueue(a,x,y+1);
if(mg[x][y-1]!='X'&&y-1>0&&visit[x][y-1]==0) //LEFT
enqueue(a,x,y-1);
if(mg[x+1][y]!='X'&&x+1<maxs&&visit[x+1][y]==0) //DOWN enqueue(a,x+1,y);
}
}
}
int main()
{
queue a;
a.rear=0;
a.top=0;
int i,j,m,n,x,y;
for(i=0; i<20; i++)
{
for(j=0; j<20; j++)
visit[i][j]=0;
}
scanf("%d%d%d%d",&x,&y,&m,&n);
enqueue(&a,x,y);
enqueue(&a,0,0);
getchar();
for(i=1; i<maxs; i++)
{
for(j=1; j<maxs; j++)
{
scanf("%c",&mg[i][j]);
}
getchar();
}
search(x,y,m,n,&a,mg);
printf("%d\n",length);
return 0;
}。