1. 程式人生 > >【面試筆試演算法】Program 5 : 推箱子 (網易遊戲筆試題)

【面試筆試演算法】Program 5 : 推箱子 (網易遊戲筆試題)

#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;
}