Post by huangno1 on Mar 2, 2017 20:52:41 GMT -8
程式說明
本程式將模擬機器人在迷宮中的行動,給定迷宮配置、行動指令和機器人起始位置,請輸出機器人最後的位置。
(1) 迷宮配置:迷宮固定為 7x7 的尺寸,而且最外圍必定為牆壁。輸入時,將以 ‘#’ 字元代表牆壁,‘.’ 字元代表道路。機器人僅能在道路上行走。
(2) 行動指令:共有五種,前四種為 UP、DOWN、LEFT 和 RIGHT,機器人在收到前述命令時,會往上、下、左和右移動一個單位。然而,如果欲前往的位置為牆壁,則會忽略該道指令。使用者會輸入若干道指令,並以 END 指令代表結束。最多只會有 10 道指令(含 END)。
(3) 機器人位置:以左下角為 (0, 0),向右為 (1, 0),向上為 (0, 1)。可以假設使用者輸入的起始位置一定是道路。
主程式中會定義迷宮為二維陣列 maze[7][7] 與指令為二維陣列 commands[10][6]。請撰寫一個函式 RobotMove(),傳入迷宮、指令和機器人起始位置,該函式會計算機器人的最終位置。注意,最後是在 main() 中輸出結果,不是在 RobotMove() 當中,請仔細思考以何種方式傳遞參數。
【輸入範例】
#######
#.....#
#..#..#
#.....#
#.....#
#.....#
#######
UP
UP
RIGHT
RIGHT
UP
LEFT
DOWN
DOWN
END
2 1
【輸出範例】
Now the robot is at (4, 2).
#include <stdio.h>
#include <string.h>
constexpr size_t MazeSize = 7, CommandLen = 5+1, NumCommands = 10;
void RobotMove ( int *x , int *y , char maze[ ][ MazeSize ] , char commands[ ][ CommandLen ] )
{
int i = 0 ;
while ( strcmp ( commands [ i ] , "END" ) )
{
if ( ! ( strcmp ( commands [ i ] , "UP" ) ) && maze [ *x + 1 ] [ *y ] != '#' )
{
*x += 1 ;
}
else if ( ! ( strcmp ( commands [ i ] , "DOWN" ) ) && maze [ *x - 1 ] [ *y ] != '#' )
{
*x -= 1 ;
}
else if ( ! ( strcmp ( commands [ i ] , "LEFT" ) ) && maze [ *x ] [ *y - 1 ] != '#' )
{
*y -= 1 ;
}
else if ( ! ( strcmp ( commands [ i ] , "RIGHT" ) ) && maze [ *x ] [ *y + 1 ] != '#' )
{
*y += 1 ;
}
i ++ ;
}
}
// ------------------------------------------
int main()
{
char maze[MazeSize][MazeSize]= {};
for (int i=MazeSize-1; i>=0; i-=1)
{
for (int j=0; j<MazeSize; j+=1)
{
scanf(" %c", &maze[j]);
}
}
char commands[NumCommands][CommandLen]= {};
int z = 0 ;
scanf ( "%s" , commands [ 0 ] ) ;
while ( strcmp ( "END" , commands [ z ] ) != 0 )
{
z++ ;
scanf ( "%s" , commands [ z ] ) ;
}
int x=0, y=0;
scanf("%d%d", &y, &x);
RobotMove(&x, &y, maze, commands);
printf("Now the robot is at (%d, %d).\n", y, x);
return 0;
}
本程式將模擬機器人在迷宮中的行動,給定迷宮配置、行動指令和機器人起始位置,請輸出機器人最後的位置。
(1) 迷宮配置:迷宮固定為 7x7 的尺寸,而且最外圍必定為牆壁。輸入時,將以 ‘#’ 字元代表牆壁,‘.’ 字元代表道路。機器人僅能在道路上行走。
(2) 行動指令:共有五種,前四種為 UP、DOWN、LEFT 和 RIGHT,機器人在收到前述命令時,會往上、下、左和右移動一個單位。然而,如果欲前往的位置為牆壁,則會忽略該道指令。使用者會輸入若干道指令,並以 END 指令代表結束。最多只會有 10 道指令(含 END)。
(3) 機器人位置:以左下角為 (0, 0),向右為 (1, 0),向上為 (0, 1)。可以假設使用者輸入的起始位置一定是道路。
主程式中會定義迷宮為二維陣列 maze[7][7] 與指令為二維陣列 commands[10][6]。請撰寫一個函式 RobotMove(),傳入迷宮、指令和機器人起始位置,該函式會計算機器人的最終位置。注意,最後是在 main() 中輸出結果,不是在 RobotMove() 當中,請仔細思考以何種方式傳遞參數。
【輸入範例】
#######
#.....#
#..#..#
#.....#
#.....#
#.....#
#######
UP
UP
RIGHT
RIGHT
UP
LEFT
DOWN
DOWN
END
2 1
【輸出範例】
Now the robot is at (4, 2).
#include <stdio.h>
#include <string.h>
constexpr size_t MazeSize = 7, CommandLen = 5+1, NumCommands = 10;
void RobotMove ( int *x , int *y , char maze[ ][ MazeSize ] , char commands[ ][ CommandLen ] )
{
int i = 0 ;
while ( strcmp ( commands [ i ] , "END" ) )
{
if ( ! ( strcmp ( commands [ i ] , "UP" ) ) && maze [ *x + 1 ] [ *y ] != '#' )
{
*x += 1 ;
}
else if ( ! ( strcmp ( commands [ i ] , "DOWN" ) ) && maze [ *x - 1 ] [ *y ] != '#' )
{
*x -= 1 ;
}
else if ( ! ( strcmp ( commands [ i ] , "LEFT" ) ) && maze [ *x ] [ *y - 1 ] != '#' )
{
*y -= 1 ;
}
else if ( ! ( strcmp ( commands [ i ] , "RIGHT" ) ) && maze [ *x ] [ *y + 1 ] != '#' )
{
*y += 1 ;
}
i ++ ;
}
}
// ------------------------------------------
int main()
{
char maze[MazeSize][MazeSize]= {};
for (int i=MazeSize-1; i>=0; i-=1)
{
for (int j=0; j<MazeSize; j+=1)
{
scanf(" %c", &maze[j]);
}
}
char commands[NumCommands][CommandLen]= {};
int z = 0 ;
scanf ( "%s" , commands [ 0 ] ) ;
while ( strcmp ( "END" , commands [ z ] ) != 0 )
{
z++ ;
scanf ( "%s" , commands [ z ] ) ;
}
int x=0, y=0;
scanf("%d%d", &y, &x);
RobotMove(&x, &y, maze, commands);
printf("Now the robot is at (%d, %d).\n", y, x);
return 0;
}