华为机试小题目之通过掷骰子决定在地图上走的步数

接着上一题的字符串处理,今天早上自己又很快编出了第二题,期待第三题关于计算器题目的完成。有时还是需要很好的心理素质,其实题目都不难。

题目要求:掷的骰子的号码决定你走的步数,比如1代表你可以走一步。在地图的每个位置上又有一个数字,来表示规则:9表示没有障碍,不做处理,3代表奖励前进一步,2代表后退两步,1代表下一次掷的筛子无效,没有其他的元素了。

题目很简单:要掷5次筛子(for循环5次即可),先通过掷的号码决定走几步(switch语句来选择),走了之后,只要没超过终点,都还看当前位置上的数字,这还是个循环的过程,比如当前数字为3,你前进一步之后,当前数字变为了2,这时又需要后退两步(最多回到起点,即不能退到起点以后),依此类推,直到到达终点或者掷骰子的次数已到。

程序很简单,需要注意的地方在程序中均有注明,经验证一些案例,没有问题。如若有问题还望指出:

/* dice_game.cpp : 定义控制台应用程序的入口点。
华为机试小题目:掷骰子决定你在地图上走几步,掷的数字就代表你走几步,在地图上同样有个数字,让你再做一次处理,
比如9代表不做处理,1代表下一次掷的筛子无效,2代表后退两步,3代表奖励前进一步。题目要求模拟该过程,返回最后总共走了多少步。

time:2012.9.16
author: zy
*/

#include "stdafx.h"
#include<iostream>
using namespace std;

void dice(int *map, int *dic, int length, int *output);
int _tmain(int argc, _TCHAR* argv[])
{
	int map[15]= {9,9,9,9,9,9,1,9,9,9,9,3,9,9,9};	//地图每一步上代表的数值,'9'不做处理,'3'奖励前进一步,'2'后退两步,'1'下一次所掷骰子无效
	int dic[5] = { 1,2,3,4,5 };			//所掷5次筛子的号码数,默认5次,可以增加一个像length一样的变量做处理
	int length = sizeof(map)/4;			//sizeof(数组名)返回的是数组的大小,单位是字节,而不是数组元素的个数
	int output = 0;

	dice(map,dic, length, &output);
	cout <<"you have gone " << output <<" steps "<<endl;
	while(1);
	return 0;
}

void dice(int *map, int *dic, int length, int *output)
{
	int i=0;
	for( ; i<5; i++) {
		switch (dic[i])
		{
			case 1: (*output)+=1;break;
			case 2: (*output)+=2;break;
			case 3: (*output)+=3;break;
			case 4: (*output)+=4;break;
			case 5: (*output)+=5;break;
			case 6: (*output)+=6;break;
			default : cout <<" wrong number"<<endl;
		}
		
		while( (*output)< length ) {
			if( map[(*output)] ==9 ) break;
			else if( map[(*output)] == 2 ) {
				(*output) -= 2;
				if((*output) < 0) (*output)=0;
			}
			else if( map[(*output)] == 1) {
				i++;
				break;
			}
			else if( map[(*output)] == 3) {
				(*output) += 1;
			}
			else { 
				cout<<"the number is wrong!"<< endl;
				break;
			}
		}

		if( (*output)>=length) {
			(*output) = length;
			cout<<" you have reached the destination!"<<endl;
			break;
		}
	}
}

运行结果就不贴了,在VS2010上做过测试。



你可能感兴趣的:(测试,华为,output,2010)