USACO 9 Problem 'obstacle' Analysis

by Rob K.

This seems to be a breadth-first search, never better implemented (speedwise, that is) than in China's Kong Weihao's solution:
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
using namespace std;
const int maxlenth=15000;

int N,s,e;
int M[110][110];
int startx,starty;
int endx,endy;
bool V[110][110];
int teamx[16000];
int teamy[16000];
int L[110][110];

void input(void){
     char C;
     scanf("%d",&N);
     scanf("%c",&C);
     for (int i=1;i<=N;i++){
         for (int j=1;j<=N;j++){
             scanf("%c",&C);
             if (C=='x') M[i][j]=true;
             else if (C=='A'){
                     startx=i;
                     starty=j;
                 }
             else if (C=='B'){
                         endx=i;
                         endy=j;
                 }
         }void output(int res){
     printf("%d\n",res);
}
inline int del(){
     s=(s+1)%maxlenth;
     return s;
}
inline void add(int x,int y,int level){
     if (!V[x][y]){
         e=(e+1)%maxlenth;
         V[x][y]=true;
         teamx[e]=x;
         teamy[e]=y;
         L[x][y]=level;
     }
}
int solve(void){
     add(startx,starty,0);
     while(s!=e){
         if (V[endx][endy]) return L[endx][endy]-1;
         int t=del();
         int x=teamx[t];
         int y=teamy[t];
         int level=L[x][y];
         for (int i=x-1;i>0;i--){  
             if (!M[i][y]) add(i,y,level+1);
             else break;
         }
         for (int i=x+1;i<=N;i++){
             if (!M[i][y]) add(i,y,level+1);
             else break;
         }
         for (int j=y-1;j>0;j--){
             if (!M[x][j]) add(x,j,level+1);
             else break;
         }
         for (int j=y+1;j<=N;j++){
             if (!M[x][j]) add(x,j,level+1);
             else break;
         }
     }
}
int main(){
     freopen("obstacle.in","r",stdin);
     freopen("obstacle.out","w",stdout);
     input();
     output(solve());
     return 0;
}