zoukankan      html  css  js  c++  java
  • Gym 100646 Problem C: LCR 模拟题

    Problem C: LCR

    题目连接:

    http://codeforces.com/gym/100646/attachments

    Description

    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

    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.

    Output

    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

    Sample Output

    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

    Hint

    题意

    模拟题,每个人一开始有三个薯片,然后从1开始,扔最多三个骰子,如果这个人的骰子小于3个的话,就扔他拥有的个数个骰子,如果他没有骰子的话,直接递给下个人。

    如果扔到L,那么就把薯片给左边,扔到R就给右边,扔到C就扔中间,扔到点,什么都不做。

    如果最后的骰子数小于这个人需要扔的,那就直接无视掉。

    胜利条件是一个人拥有所有人最后的薯片。

    如果游戏能结束,就直接输出胜利玩家,否则就输出下一个该谁扔。

    题解:

    模拟题,就模拟就好了。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    
    int n;
    string s;
    int cnt[100];
    int cas,mi,now,t;
    void init(){
        memset(cnt,0,sizeof(cnt));
        t=0;
        mi=0;
        now=0;
    }
    void soe(int x,int y,int z){
        for(int i=x;i<y;i++){
            if(s[i]=='R'){
                cnt[z]--;
                cnt[(z+n-1)%n]++;
            }
            if(s[i]=='L'){
                cnt[z]--;
                cnt[(z+1)%n]++;
            }
            if(s[i]=='C'){
                cnt[z]--;
                mi++;
            }
            if(s[i]=='.')continue;
        }
    }
    void solve(){
        init();
        mi=0;
        printf("Game %d:
    ",++cas);
        memset(cnt,0,sizeof(cnt));
        cin>>s;
        for(int i=0;i<n;i++)cnt[i]=3;
        int cccc=0;
        int flag = -1;
        while(t<s.size()){
            cccc++;
            if(cccc>1000000)break;
            if(t+min(cnt[now],3)<=s.size()){
                int pre = cnt[now];
                soe(t,t+min(cnt[now],3),now);
                t+=min(pre,3);
                now++;
                now%=n;
                while(cnt[now]==0){
                    now++;
                    now%=n;
                }
            }else{
                break;
            }
    
            for(int i=0;i<n;i++){
                if(cnt[i]+mi==3*n)flag=i;
            }
    
            if(flag!=-1)break;
        }
    
    
        for(int i=0;i<n;i++){
            printf("Player %d:%d",i+1,cnt[i]);
            if(flag==i)printf("(W)");
            if(flag==-1&&i==now)printf("(*)");
            printf("
    ");
        }
    
        printf("Center:%d
    ",mi);
        printf("
    ");
    }
    int main(){
        //freopen("1.in","r",stdin);
        while(scanf("%d",&n)!=EOF){
            if(n==0)break;
            solve();
        }
    }
  • 相关阅读:
    管理这门技术和艺术
    主流双核处理器对比
    20111226自然醒
    message_t
    安装 SQL Server 2008 Management Studio Express
    Linux Ext2/Ext3/Ext4 文件系统分区
    多版本火狐共存方案及火狐配置文档高级管理技巧[转自火狐社区]
    心理学,慢慢学
    system pause in C#
    play with js
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5692801.html
Copyright © 2011-2022 走看看