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