/*
    基本情報技術者試験          平成13年度・秋期・午後 問10
                                BohYoh Shibata PREPARATION
*/

#define   UP        0
#define   RIGHT     1
#define   DOWN      2
#define   LEFT      3
#define   ROAD      0x00             /* 道のコード */
#define   WALL      0xff             /* 壁のコード */
#define   SMAX      8
#define   ENTRANCE  0xf0             /* 始点のコード */
#define   EXIT      0xf1             /* 終点のコード */

int rcheck(void);
int fcheck(void);
void go(void);
void maze(void);

int M[SMAX][SMAX], x, y, dir;

void maze()
{
    while ( M[y][x] != EXIT ) {
        printf("dir=%d y=%d x=%d\n", dir, y, x);
        if ( ( rcheck() == ROAD ) ||
             ( rcheck() == EXIT ) ) {
            dir = ( dir+1 ) % 4;
            go();
        }
        else if ( ( fcheck() == ROAD ) ||
                  ( fcheck() == EXIT ) ) go();
        else dir = ( dir+3 ) % 4;
    }
    printf("dir=%d y=%d x=%d\n", dir, y, x);
    return;
}

int rcheck()
{
    if      ( dir == UP )     return M[y][x+1];
    else if ( dir == RIGHT )  return M[y+1][x];
    else if ( dir == DOWN )   return M[y][x-1];
    else                      return M[y-1][x];
}

int fcheck()
{
    if      ( dir == UP )     return M[y-1][x];
    else if ( dir == RIGHT )  return M[y][x+1];
    else if ( dir == DOWN )   return M[y+1][x];
    else                      return M[y][x-1];
}

void go()
{
    if      ( dir == UP )    y--;
    else if ( dir == RIGHT ) x++;
    else if ( dir == DOWN )  y++;
    else                     x--;
}