当牛牛走完k步后,并把所有的可能都走一遍,不能遍历所有可通行的点,返回-1.
能则返回head追上tail后步长,




-----------------------------------------------------------------------------------------------------------------------------------
#include<stdio.h>
struct node{
    int x;
    int y;
    int step;
};
int main(){
    struct node que[2501];//节点
    int n,m;//行 列
    int head,tail;//记录当前点和下一步的点
    int i,j;
    int x0,y0;//起点
    int k;//步长
    int next[51][2];//下一步
    int book[51][51]={0},tx,ty;//记录走过的点
    int result;//记录结果的步长
    char a[51][51];//地牢
   
    scanf("%d %d",&n,&m);
    for(i=0;i<n;i++){
        scanf("%s",a[i]);
    }
    scanf("%d %d",&x0,&y0);
    scanf("%d",&k);
    for(i=0;i<k;i++){
        scanf("%d %d",&next[i][0],&next[i][1]);
    }
    head = 1;
    tail = 1;
    que[tail].x=x0;
    que[tail].y=y0;
    que[tail].step=0;
    tail++;
    book[x0][y0] = 1;
    while(head<tail){
        for(int i=0;i<k;i++){//走一步可能走4个方向
            tx=que[head].x+next[i][0];
            ty=que[head].y+next[i][1];
            if(tx<0||ty<0||tx>=n||ty>=m||a[tx][ty]=='X'){continue;}//判断越界和碰到X
            if(a[tx][ty]=='.' && book[tx][ty] == 0){//判断在不在.上面,这个位置有没被走过
                que[tail].x = tx;
                que[tail].y = ty;//走一步后,产生新的节点
                que[tail].step = que[head].step+1;//记录该节点的步长
                tail++;//下一步的点后移
                book[tx][ty] = 1;//记录该点被走过
            }
        }
        head ++;//当前点走一个节点,走完所有节点,赶上tail ,退出循环
    }
    result = que[tail-1].step;
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            if(book[i][j] == 0 && a[i][j]=='.')
            {
                result = -1;
            }
        }
    }
    printf("%d", result);
}