【面試筆試演算法】Program 5 : 推箱子 (網易遊戲筆試題)
阿新 • • 發佈:2019-02-08
#include "stdafx.h" #include <string> #include <stdio.h> #include <iostream> using namespace std; char Board[ 100][100 ]; // 棋盤 char Boardbak[100][100 ]; int main() { int n, m , s; string temp (100, '0'); int player_x = 0 , player_y = 0; int player_x_bak = 0 , player_y_bak = 0; bool havaPlayer = false ; cin >> n >> m >> s; for (int x = 0; x < m; ++x) { cin >> temp; for ( int y = 0 ; y < n; ++y ) { if (! havaPlayer && temp [y] == '1') { player_x_bak = x; player_y_bak = y; havaPlayer = true ; } Boardbak [x][ y] = temp [y]; } } while (s--) { bool isSuccess = false; int count = 0; string path (10000, '0'); cin >> count >> path; //初始化棋盤 for ( int i = 0 ; i < m; ++i ) { for ( int j = 0 ; j < n; ++j ) { Board [i][ j] = Boardbak [i][ j]; } } //初始化玩家位置 player_x = player_x_bak; player_y = player_y_bak; for ( int z = 0 ; z < count;++z ) { if ( path[z ] == 'd' )//向下 { if ( player_x + 2 < m) // 判斷下面沒有越界 { if (! isSuccess && Board [player_x + 1][ player_y] == '3')// 判斷下面有箱子 { if ( Board[player_x + 2 ][player_y] == '0')// 判斷箱子下面是空格 { //更新棋盤 Board [player_x][player_y] = '0' ; Board [player_x + 1][ player_y] = '1' ; Board [player_x + 2][ player_y] = '3' ; //更新玩家位置 player_x = player_x + 1; } else if (Board[player_x + 2 ][player_y] == '2') //箱子下面是目標點 { isSuccess = true ; } } else // 判斷沒有箱子,就只有玩家動 { if ( Board[player_x + 1 ][player_y] == '0')// 玩家下面是空格 { //更新棋盤 Board [player_x][player_y] = '0' ; Board [player_x + 1][ player_y] = '1' ; //更新玩家位置 player_x = player_x + 1; } } } else { if ( Board[player_x + 1 ][player_y] == '0') //下面越界,玩家下面是空格 { //更新棋盤 Board [player_x][player_y] = '0' ; Board [player_x + 1][ player_y] = '1' ; //更新玩家位置 player_x = player_x + 1; } } } else if (path[z ] == 'u' )//向上 { if ( player_x - 2 >=0) // 判斷上面沒有越界 { if (! isSuccess && Board [player_x - 1][ player_y] == '3')// 判斷上面有箱子 { if ( Board[player_x - 2 ][player_y] == '0')// 判斷箱子上面是空格 { //更新棋盤 Board [player_x][player_y] = '0' ; Board [player_x - 1][ player_y] = '1' ; Board [player_x - 2][ player_y] = '3' ; //更新玩家位置 player_x = player_x - 1; } else if (Board[player_x - 2 ][player_y] == '2') //箱子上面是目標點 { isSuccess = true ; } } else // 判斷沒有箱子,就只有玩家動 { if ( Board[player_x - 1 ][player_y] == '0')// 玩家上面空格 { //更新棋盤 Board [player_x][player_y] = '0' ; Board [player_x - 1][ player_y] = '1' ; //更新玩家位置 player_x = player_x - 1; } } } else { if ( Board[player_x - 1 ][player_y] == '0') //上面越界,玩家上面是空格 { //更新棋盤 Board [player_x][player_y] = '0' ; Board [player_x - 1][ player_y] = '1' ; //更新玩家位置 player_x = player_x - 1; } } } else if (path[z ] == 'l' )//左 { if ( player_y - 2 >= 0 ) // 判斷左邊沒有越界 { if (! isSuccess && Board [player_x][player_y -1 ] == '3')// 判斷左邊有箱子 { if ( Board[player_x ][player_y - 2] == '0') //判斷箱子左邊是空格 { //更新棋盤 Board [player_x][player_y] = '0' ; Board [player_x][player_y - 1] = '1' ; Board [player_x][player_y - 2] = '3' ; //更新玩家位置 player_y = player_y - 1; } else if (Board[player_x ][player_y - 2] == '2') //箱子左邊是目標點 { isSuccess = true ; } } else // 判斷沒有箱子,就只有玩家動 { if ( Board[player_x ][player_y - 1] == '0') //玩家左邊是空格 { //更新棋盤 Board [player_x][player_y] = '0' ; Board [player_x][player_y -1 ] = '1' ; //更新玩家位置 player_y = player_y - 1; } } } else { if ( Board[player_x ][player_y - 1] == '0') //左邊越界,玩家左邊是空格 { //更新棋盤 Board [player_x][player_y] = '0' ; Board [player_x][player_y - 1] = '1' ; //更新玩家位置 player_y = player_y - 1; } } } else if (path[z ] == 'r' )//向右 { if ( player_y + 2 < n) // 判斷右邊沒有越界 { if (! isSuccess && Board [player_x][player_y + 1] == '3')// 判斷右邊有箱子 { if ( Board[player_x ][player_y + 2] == '0') //判斷箱子右邊是空格 { //更新棋盤 Board [player_x][player_y] = '0' ; Board [player_x][player_y + 1] = '1' ; Board [player_x][player_y + 2] = '3' ; //更新玩家位置 player_y = player_y + 1; } else if (Board[player_x ][player_y + 2] == '2') //箱子右邊是目標點 { isSuccess = true ; } } else // 判斷沒有箱子,就只有玩家動 { if ( Board[player_x ][player_y + 1] == '0') //玩家右邊是空格 { //更新棋盤 Board [player_x][player_y] = '0' ; Board [player_x][player_y + 1] = '1' ; //更新玩家位置 player_y = player_y + 1; } } } else { if ( Board[player_x ][player_y + 1] == '0') //右邊越界,玩家右邊是空格 { //更新棋盤 Board [player_x][player_y] = '0' ; Board [player_x][player_y + 1] = '1' ; //更新玩家位置 player_y = player_y + 1; } } } } if ( isSuccess) { cout << "YES" << endl; } else cout << "NO" << endl; } return 0; }