2017网易游戏·在线笔试编程题·第一题
2016-09-18 22:15
519 查看
题目描述: 目前有一款益智小游戏,对经典的吃豆子游戏进行了改编。玩家将在类似如下图中所示的网格地图中进行游戏,当玩家将所有的“豆子”吃完后,游戏便结束。具体的游戏规则如下: 1.玩家在游戏开始后,出生在地图的左上角,且面朝右侧。
2.玩家每次只能移动一格,移动的方式只能从如下两种方式中选择一种: a.按玩家当前的朝向水平移动一格(如果玩家目前面朝右侧,则玩家向右移动一格;如果玩家目前面朝左侧,则玩家向左移动一格)。
b.向下移动一格。但是每次向下移动后,玩家的朝向都会发生改变,如果玩家目前面朝右侧,向下移动一格后,将面朝左侧,反之亦然。 3.当玩家移动到“有豆子”的地方,就会将豆子“吃掉”,“吃掉”的操作为游戏自动完成。
4.当玩家将地图中所有豆子都“吃掉”后,游戏通关成功,并且将统计玩家移动所花的总步数,步数越少获得的积分越高。
现在希望你为游戏编写一个“外挂”,当游戏地图加载后,自动规划计算出能让游戏通关且所花步数最少的方案;为了方便起见,只需要你输出步数。
输入
第一行将输入两个数n和m(1<=n, m<=150)用空格隔开,分别代表当前加载地图的行数和列数。接下来的n行均将输入m个字符,用于描述地图的内容。其中’E’代表该格内没有豆子,’W’代表有豆子。我们确保左上角的格子即出生点内没有豆子。
输出
一个整数,使游戏通关的最少步数。
样例输入
4 5 EWEEWEEWEEEWEEEWEEEE
样例输出
11
E特殊测试用例:
4 5
EWEEW
EWEEE
EEEEE
EEEEE
4 5
EEEEE
EEEEE
EEEEE
EEEEE
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
相关文章推荐
- 网易2017校招内推在线笔试编程题3
- 网易互娱2017实习生招聘游戏研发工程师在线笔试第二场 C
- 网易互娱2017实习生招聘游戏研发工程师在线笔试第二场(一起消消毒)
- 2017网易实习数据挖掘工程师笔试在线编程题《分饼干》
- 网易互娱2017实习生招聘游戏研发工程师在线笔试第二场(神奇的数)
- 2017网易游戏编程笔试题·第一题
- 网易互娱2017实习生招聘游戏研发工程师在线笔试第二场(图像处理)
- 电子数字 网易游戏在线笔试 第一题 hihocoder
- 网易2017内推笔试编程题合集(二)第一题 混合颜料
- 网易游戏2016校园招聘“游戏研发&平台开发”在线笔试——C题 Complicated Expression
- 网易2017春招笔试编程题 分饼干
- 网易2017内推笔试编程题合集(二)(第三题) 不要二
- 2017京东在线笔试编程题之 买东西
- 网易游戏技术岗在线编程题(一)
- 网易互娱2017实习生招聘在线笔试(一)
- 名企笔试:网易游戏2017招聘笔试题(消除重复元素)
- 2017网易游戏雷火盘古实习生招聘笔试真题 第四题
- 2017网易游戏雷火盘古实习生招聘笔试(4)赛马
- 2017网易内推c++工程师笔试——编程题
- 网易2017春招笔试真题编程题集合——4.消除重复元素