[湖南大学程序设计实训训练作业二]6.飞行棋(递归模拟)

【问题描述】

大家当年一定都下过飞行棋吧。现在Lele和Yueyue要下的棋和这个很相似,只是更简单一点而已。

   棋盘由N个格子组成,分别标记为第0格到第N-1格。格子分为两种,一种是普通格子,即表示在该格可以停留。否则是特殊的格子,一旦走到上面,就要根据上面标记的数飞到相应的格子上。如果飞到一个特殊的格子上,则可以继续飞。

   除了第0格外,其他格子都只能容纳一个玩家。即一旦A玩家已经在某个格子上,B玩家又走到这里,A玩家则会被踢回第0格,而B玩家留在这个格子上面。

   第N-1个格子是终点,一旦一个玩家走到这个格子上,该玩家获胜,游戏结束。

   刚刚开始时,两个玩家都站在第0格上,依次扔骰子,根据骰子显示的点数走相应的格子数。比如,玩家在第0格,扔出了5点,则会走到第5个格子上。如果玩家走得超出了棋盘的范围,则要往回走一定的步数。比如,棋盘一共有7(0~6)个格子,玩家在第4格上,扔出了6点,最终他会走到第2格上(4->5->6->5->4->3->2)。

   根据观察,骰子扔出来的数也是有规律的。
   对于每一盘棋,扔出的第一个点数为 F0=(A*C+B)%6+1,第二个点数为 F1=(A*F0+B)%6+1,第三个点数为 F2=(A*F1+B)%6+1 ....依此类推。

   每一盘棋都是由Lele先走,现在就请你当裁判,看谁能获胜。

【输入形式】

本题目包含多组测试,请处理到文件结束。
每组数据占两行。

  • 第一行有4个整数N,A,B,C(含义见题目描述,6<N<200,0<=A,B,C<=2^31)。
  • 第二行有N个字符串,分别表示棋盘上第0个到第N-1个格子的内容。两个字符串之间用一个空格分隔开。
  • 如果字符串为"N",则表示这个格子为普通格子。否则字符串为"GX"(X为0到N-1之间的整数)的形式,其中X表示玩家走到这个格子时,要马上飞到第X个格子。
  • 数据保证第0个和第N-1个格子一定为"N"。

【样例输入】

7 1 0 6
N G3 N N N N N
7 1 0 6
N G4 N N N N N

【样例输出】

Lele
Yueyue

题解

思路

  • 1.模拟题嘛,地图先记录下来,我们输入的是字符,我们直接存int就可以了,这样跳的时候会方便一点
  • 注意:递归出口要找好
  • 注意:反向 传送 击飞 三个判断都要有
  • 注意:模拟题一定要仔细!!!

代码

#include<iostream>
#include<vector>
using namespace std;
vector<int> map;
int n,a,b,c;
string name[2]={"Lele","Yueyue"};
int get_num(string temp){
	int num=0;
	for(int i=1;i<temp.length();i++){
		num*=10;
		num+=temp[i]-'0';
	}	
	return num;
}
void go(int cnt,int A,int B,int bushu){
	if(A==n-1||B==n-1){
		if(A==n-1) cout<<name[0]<<endl;
		else cout<<name[1]<<endl;
		return ;
	} 
	if(cnt==0){
		A+=bushu;
		/*************是否反向*******************/
		if(A>=n) A=n-1-A%(n-1);
		/*************是否传送*******************/
		if(map[A]!=-1) A=map[A]; 
		/*************是否击飞对手*******************/
		if(A==B&&A!=0) B=0;
	}else{
		B+=bushu;
		/*************是否反向*******************/
		if(B>=n) B=n-1-B%(n-1);
		/*************是否传送*******************/
		if(map[B]!=-1) B=map[B]; 	
		/*************是否击飞对手*******************/
		if(A==B&&A!=0) A=0;	
	}
	//cout<<cnt<<" "<<A<<" "<<B<<" "<<bushu<<endl; 
	go((cnt+1)%2,A,B,(a*bushu+b)%6+1);//换边+计算新的步数,递归模拟 
}
int main(){
	while(cin>>n>>a>>b>>c){
		map.clear();
		for(int i=0;i<n;i++){
			string temp;
			cin>>temp;
			if(temp=="N")
				map.push_back(-1);
			else
				map.push_back(get_num(temp));	
		}
		go(0,0,0,(a*c+b)%6+1);		
	}
	return 0;
} 
  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值