HDU-2778 LCR

传送门

问题描述:

LCR is a simple game for three or more players. Each player starts with three chips and the object is to be the last person to have any chips. Starting with Player 1, each person rolls a set of three dice. Each die has six faces, one face with an L, one with a C, one with an R and three with a dot. For each L rolled, the player must pass a chip to the player on their left (Player 2 is considered to be to the left of Player 1); for each R rolled, the player passes a chip to the player on their right; and for each C rolled, the player puts a chip in a central pile which belongs to no player. No action is taken for any dot that is rolled. Play continues until only one player has any chips left. In addition, the following rules apply:

  1. A player with no chips is not out of the game, since they may later gain chips based on other players’ rolls.
  2. A player with only 1 or 2 chips left only rolls 1 or 2 dice, respectively. A player with no chips left does not roll but just passes the dice to the next player.

Your job is to simulate this game given a sequence of dice rolls.

输入说明:

Input will consist of multiple test cases. Each test case will consist of one line containing an integer n (indicating the number of players in the game) and a string (specifying the dice rolls). There will be at most 10 players in any game, and the string will consist only of the characters L',C’, R' and.’. In some test cases, there may be more dice rolls than are needed (i.e., some player wins the game before you use all the dice rolls). If there are not enough dice rolls left to complete a turn (for example, only two dice rolls are left for a player with 3 or more chips) then those dice rolls should be ignored. A value of n = 0 will indicate end of input.

输出说明:

For each test case, output the phrase `Game i :’ on a single line (where i is the case number starting at 1) followed by a description of the state of the game. This desciption will consist of n + 1 lines of the form

Player 1:c1
Player 2:c2

Player n :cn
Center:ct

where c1, c2…cn are the number of chips each player has at the time the simulation ended (either because some player has won or there are no more remaining dice rolls) and ct is the number of chips in the center pile. In addition, if some player has won, you should append the string (W)' after their chip count; otherwise you should append the string(*)’ after the chip count of the player who is the next to roll. The only blank on any line should come before the game number or the player number. Use a single blank line to separate test cases.

SAMPLE INPUT:

3 LR.CCR.L.RLLLCLR.LL…R…CLR.

5 RL…C.L
0

SAMPLEOUTPUT:

Game 1:
Player 1:0
Player 2:0
Player 3:6(W)
Center:3

Game 2:
Player 1:1
Player 2:4
Player 3:1
Player 4:4(*)
Player 5:4
Center:1

思路:

理解上比较复杂的一道题目,题意大概是一群人(人数大于等于3)玩掷骰子的游戏,每人一开始有3个筹码,每次骰3个骰子,如果是L就把一个骰子给左边的人,如果是R就把一个骰子给右边的人,如果是C就把一个骰子放在中心(这个歌骰子不属于任何人),如果是’.'就什么也不进行操作,如果手中的筹码数量小于3,就骰对应数量的骰子(例如手中有1个筹码就骰一个骰子),如果手中没有筹码,就不骰出骰子(注意,没有筹码不意味退出游戏,还在游戏中,因为他左右的人有可能给他筹码)游戏结束的情况是当只有一个人手中有筹码,其他所有人的筹码数都为0,或者输入的一行骰子的情况都用完了。(如果剩余骰子情况数量,小于应骰的数量,直接忽略这些操作,直接结束游戏)输出则要主要格式,以及标注赢家(最后进行操作的玩家)写起来很烦,理解了很简单,加油。

AC代码:

#include<bits/stdc++.h>
using namespace std;
int n;
string s;
int num[100];
int no,middle,now,t,flag,i,cccc,pre,len;
void pass(int x,int y,int z)
{
    for(int i=x;i<y;i++)
        {
        if(s[i]=='R')
        {
            num[z]--;
            num[(z+n-1)%n]++;
        }
        if(s[i]=='L')
        {
            num[z]--;
            num[(z+1)%n]++;
        }
        if(s[i]=='C')
        {
            num[z]--;
            middle++;
        }
        if(s[i]=='.') /**/continue;
    }
}
int main()
{
    cin>>n;
    while(n)
    {
        memset(num,0,sizeof(num));
        t=0;
        middle=0;
        now=0;
        cout<<"Game "<<++no<<":"<<endl;
        memset(num,0,sizeof(num));
        cin>>s;
        len=s.length();
        for(i=0;i<n;i++)
        {
            num[i]=3;
        }
        flag = -1;
        while(t<len)
        {
            if(t+min(num[now],3)<=s.size())
            {
                pre=num[now];
                pass(t,t+min(num[now],3),now);
                t+=min(pre,3);
                now++;
                now%=n;
                while(num[now]==0)
                {
                    now++;
                    now%=n;
                }
            }
            else
            {
                break;
            }
            for(int i=0;i<n;i++)
            {
                if(num[i]+middle==3*n)
                {
                    flag=i;
                }
            }
            if(flag!=-1) break;
        }
        for(i=0;i<n;i++)
        {
            cout<<"Player "<<i+1<<":"<<num[i];
            if(flag==i)
            {
                cout<<"(W)";
            }
            if(flag==-1&&i==now)
            {
                cout<<"(*)";
            }
            cout<<endl;
        }
        cout<<"Center:"<<middle<<endl;
        cin>>n;
        if (n!=0)
        {
                        cout<<endl;
        }
    }
    return 0;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值