/*
基本情報技術者試験 平成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--;
}