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

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

題目描述: 目前有一款益智小遊戲,對經典的吃豆子游戲進行了改編。玩家將在類似如下圖中所示的網格地圖中進行遊戲,當玩家將所有的“豆子”吃完後,遊戲便結束。具體的遊戲規則如下: 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;
}