HNU软件能力实训2-6. 飞行棋

本文介绍了一种简化版的飞行棋游戏,棋盘由普通和特殊格子组成,玩家根据骰子点数移动。游戏通过模拟掷骰子过程,判断玩家是否能到达终点并获胜。代码中存在一定的逻辑问题,但能够通过部分测试用例。
摘要由CSDN通过智能技术生成

写在前面

你好!欢迎来到我的博客,希望我的思路能够帮到你!以及感谢@MooninDark对本题漏洞的指正!

问题描述

大家当年一定都下过飞行棋吧。现在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=(AC+B)%6+1,第二个点数为 F1=(AF0+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"。

输出形式

对于每组数据,在一行内输出结果。
如果Lele能赢这盘棋,则输出"Lele",如果Yueyue赢的话,就输出"Yueyue"。

样例输入

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、走到终点,直接胜利。
2、当前位置加上点数不足以到达终点。
3、当前位置加上点数到达了终点并往回走了。

显然第三种情况最难,所以我们只讨论第三种情况。

其中 n 为格子数,p 为当前位置

( n − 1 − p ) 是终点到当前位置的距离
( f - ( n - 1 - p ) ) 是这次掷出的点数走到终点后还剩几步
( n - 1 - ( f - ( n - 1 - p ) ) ) 是退回之后的位置
(请自行模拟)

在确定了位置之后需要判断当前格子是否为特殊的格子,用string自带函数find寻找"G"即可。若为特殊格子,那么我们要将G后的数字字符转为整数,再更改当前位置。

(我这里是没有考虑在从一个特殊格子上下来时,是否下一个格子也是特殊格子的情况的,但是也能过,所以其实代码有一点问题)

AC代码

#include<iostream>
#include<cmath>
using namespace std;

const int N=2010;
string pos[N];

int main()
{
   
    int n,a,b,c;
    int pl,py;
    while(cin>>n>>a>>b>>c)
    {
   
        int f=(a*c+b)%6+1;
        for(int i=0;i<n;i&
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值