1. 程式人生 > >2017網易遊戲·線上筆試程式設計題·第一題

2017網易遊戲·線上筆試程式設計題·第一題

題目描述: 目前有一款益智小遊戲,對經典的吃豆子游戲進行了改編。玩家將在類似如下圖中所示的網格地圖中進行遊戲,當玩家將所有的“豆子”吃完後,遊戲便結束。具體的遊戲規則如下: 1.玩家在遊戲開始後,出生在地圖的左上角,且面朝右側。
2.玩家每次只能移動一格,移動的方式只能從如下兩種方式中選擇一種: a.按玩家當前的朝向水平移動一格(如果玩家目前面朝右側,則玩家向右移動一格;如果玩家目前面朝左側,則玩家向左移動一格)。
b.向下移動一格。但是每次向下移動後,玩家的朝向都會發生改變,如果玩家目前面朝右側,向下移動一格後,將面朝左側,反之亦然。 3.當玩家移動到“有豆子”的地方,就會將豆子“吃掉”,“吃掉”的操作為遊戲自動完成。
4.當玩家將地圖中所有豆子都“吃掉”後,遊戲通關成功,並且將統計玩家移動所花的總步數,步數越少獲得的積分越高。
現在希望你為遊戲編寫一個“外掛”,當遊戲地圖載入後,自動規劃計算出能讓遊戲通關且所花步數最少的方案;為了方便起見,只需要你輸出步數。

輸入
第一行將輸入兩個數n和m(1<=n, m<=150)用空格隔開,分別代表當前載入地圖的行數和列數。接下來的n行均將輸入m個字元,用於描述地圖的內容。其中’E’代表該格內沒有豆子,’W’代表有豆子。我們確保左上角的格子即出生點內沒有豆子。
輸出
一個整數,使遊戲通關的最少步數。
這裡寫圖片描述
樣例輸入
4 5 EWEEWEEWEEEWEEEWEEEE
樣例輸出
11

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n,m;
    int
flower=0; vector<vector<int>> vv; while(cin>>n>>m){ vv.resize(n); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ char tmp; cin>>tmp; if(tmp=='E') vv[i].push_back(0); if
(tmp=='W'){ vv[i].push_back(1); flower++; } } } } if(flower==0) { cout<<0<<endl; return 0; } int cursor=0,pre_cur=0; int count=0,delta=0; bool end=false; // odd line: from right to left. // even line: from left to right. for(int i=0;i<vv.size();i++) { // pre search 1 if(i%2==0){ for(int j=vv[i].size()-1;j>=i;j--){ if(vv[i][j] || (i+1<n && vv[i+1][j])) { pre_cur=j; break; } } } else{ for(int j=0;j<vv[i].size();j++){ if(vv[i][j] || (i+1<n && vv[i+1][j])) { pre_cur=j; break; } } } count+=abs(pre_cur-cursor); // when no flowers, it will turn down to the end. so calculate the steps, if(abs(pre_cur-cursor)==0 && vv[i][cursor]==0){ delta++; }else{ delta=0; } cursor=pre_cur; count++;// next line! } cout<<count-delta-1<<endl; return 0; }

E特殊測試用例:
4 5
EWEEW
EWEEE
EEEEE
EEEEE

4 5
EEEEE
EEEEE
EEEEE
EEEEE