2017網易遊戲程式設計筆試題·第一題
阿新 • • 發佈:2018-12-23
題目描述: 目前有一款益智小遊戲,對經典的吃豆子游戲進行了改編。玩家將在類似如下圖中所示的網格地圖中進行遊戲,當玩家將所有的“豆子”吃完後,遊戲便結束。具體的遊戲規則如下: 1.玩家在遊戲開始後,出生在地圖的左上角,且面朝右側。
2.玩家每次只能移動一格,移動的方式只能從如下兩種方式中選擇一種: a.按玩家當前的朝向水平移動一格(如果玩家目前面朝右側,則玩家向右移動一格;如果玩家目前面朝左側,則玩家向左移動一格)。
b.向下移動一格。但是每次向下移動後,玩家的朝向都會發生改變,如果玩家目前面朝右側,向下移動一格後,將面朝左側,反之亦然。 3.當玩家移動到“有豆子”的地方,就會將豆子“吃掉”,“吃掉”的操作為遊戲自動完成。
4.當玩家將地圖中所有豆子都“吃掉”後,遊戲通關成功,並且將統計玩家移動所花的總步數,步數越少獲得的積分越高。
現在希望你為遊戲編寫一個“外掛”,當遊戲地圖載入後,自動規劃計算出能讓遊戲通關且所花步數最少的方案;為了方便起見,只需要你輸出步數。
輸入
第一行將輸入兩個數n和m(1<=n, m<=150)用空格隔開,分別代表當前載入地圖的行數和列數。接下來的n行均將輸入m個字元,用於描述地圖的內容。其中’E’代表該格內沒有豆子,’W’代表有豆子。我們確保左上角的格子即出生點內沒有豆子。
輸出
一個整數,使遊戲通關的最少步數。
輸入樣例
4 5
EWEEW
EEWEE
EWEEE
WEEEE |
輸出樣例
11 |
思路:記錄每行最前一個豆子的位置和最後一次豆子的位置,比較當前行和下一行的位置,並取最長距離走(因為沒有走過的地方之後是不會再走的),並用一個標記,記錄上次走到的位置,每次加步數之前要減掉前面沒走的距離(因為記錄的是下標)
除了最後一行每次走完都要步數加一,表示移動到了下一行
#include<algorithm> #include<iostream> #include<cstdio> using namespace std; int main() { int m, n; char x; while (cin >> m >> n) { int ans = 0, flag = -1, mp[200][2] = { 0 }; for (int a = 0; a < m; a++) { int ji = 0; for (int b = 0; b < n; b++) { cin >> x; if (x == 'W') { if (!ji) mp[a][0] = mp[a][1] = b; else mp[a][1] = b; ji++; } } if (flag == -1 && !ji) flag = a; if (flag != -1 && ji) flag = -1; } int ji = 1; for (int a = 0; a<(flag==-1?m:flag); a++) { if (a == (flag == -1 ? m : flag) - 1) { if (a & 1) ans += n - mp[a][0] - (n - ji) + 1; else ans += mp[a][1] - ji; break; } if (a & 1) ans += max(n - mp[a][0], n - mp[a + 1][0]) - (n - ji) + 1, ji = max(mp[a][0], mp[a + 1][0]); else ans += max(mp[a][1], mp[a + 1][1]) - ji, ji = max(mp[a][1], mp[a + 1][1]); ans++; } cout << ans << endl; } return 0; }