zoukankan      html  css  js  c++  java
  • 洛谷 P1166 打保龄球

    题目描述

    打保龄球是用一个滚球去打击十个站立的柱,将柱击倒。一局分十轮,每轮可滚球一次或多次,以击倒的柱数为依据计分。一局得分为十轮得分之和,而每轮的得分不仅与本轮滚球情况有关,还可能与后续一两轮的滚球情况有关。即某轮某次滚球击倒的柱数不仅要计入本轮得分,还可能会计入前一两轮得分。具体的滚球击柱规则和计分方法如下:

    (1)若某一轮的第一次滚球就击倒全部十个柱,则本轮不再滚球(若是第十轮则还需另加两次滚球,不妨称其为第十一轮和第十二轮,并不是所有的情况都需要滚第十一轮和第十二轮球)。该轮得分为本次击倒柱数10与以后两次滚球所击倒柱数之和。

    (2)若某一轮的第一次滚球未击倒十个柱,则可对剩下未倒的柱再滚球一次。如果这两次滚球击倒全部十个柱,则本轮不再滚球(若是第十轮则还需另加一次滚球),该轮得分为这两次共击倒柱数 1010 与以后一次滚球所击倒柱数之和。

    (3)若某一轮两次滚球未击倒全部十个柱,则本轮不再继续滚球,该轮得分为这两次滚球击倒的柱数之和。

    总之,若―轮中一次滚球或两次滚球击倒十个柱,则本轮得分是本轮首次滚球开始的连续三次滚球击倒柱数之和(其中有一次或两次不是本轮滚球)。若一轮内二次滚球击倒柱数不足十个,则本轮得分即为这两次击倒柱数之和。下面以实例说明如下(字符“/”表示击倒当前球道上的全部的柱):

    轮 1 2 3 4 5 6 7 8 9 10 11 12

    击球情况 / / / 72 9/ 81 8/ / 9/ / 8/

    各轮得分 30 27 19 9 18 9 20 20 20 20

    累计总分 30 57 76 85 103 112 132 152 172 192

    现在请你编写一个保龄球实时计分程序,用来计算和显示某轮结束后的得分情况。若某轮的得分暂时无法算出,则该轮得分不显示。

    输入输出格式

    输入格式:

     

    仅有一行,为前若干轮滚球的情况,每轮滚球用一到两个字符表示,每一个字符表示一次击球,字符“/”表示击倒当前球道上的全部的柱,否则用一个数字字符表示本次滚球击倒的当前球道上的柱的数目,两轮滚球之间用一个空格字符隔开。

    如上例对应的输入文件内容为:/ / / 72 9/ 81 8/ / 9/ / 8/

     

    输出格式:

     

    共两行,第一行为每轮得分,第二行为到当前轮为止的总得分。每个得分之间用一个空格隔开。

     

    输入输出样例

    输入样例#1: 复制
    /    /    /   72    9/   81   8/    /    9/    /   8/
    输出样例#1: 复制
    30   27  19    9   18    9   20   20   20   20 
    30   57  76   85  103  112  132  152  172  192
    思路:模拟,就是比较麻烦,关键是要考虑清楚所有的情况,不要漏掉。
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>  
    using namespace std;
    string s;
    int d[13];
    int df[13][3];
    bool y[13][3];
    int zdf,l=1,zl=1;
    int main(){    
        getline(cin,s);
        memset(d,0,sizeof(d));
        memset(y,0,sizeof(y));
        memset(df,0,sizeof(df));
        int x=s.length();
        for(int i=0;i<x;i++){         
            if(s[i]==' ')    continue;
            if(s[i]=='/'){
                df[zl][l]=10-df[zl][l-1];
                y[zl][l]=true;
                if(l==1){ zl++;continue; }
            }
            else{
                df[zl][l]=s[i]-48;
                y[zl][l]=true;
            }
            if(l==2){ ++zl;l=1; }
            else ++l;
        }
        zl--;
        for(int i=1;i<=zl;i++){
            if(df[i][1]==10){
                if(!y[i+1][1])    break;
                if(df[i+1][1]==10&&(!y[i+2][1]))    break;
                if(df[i+1][1]<10&&(!y[i+1][2]))    break;
                d[i]=10+df[i+1][1];
                if(df[i+1][1]==10)    d[i]+=df[i+2][1];
                else    d[i]+=df[i+1][2];
            }
            else{
                if(!y[i][2])    break;
                if(df[i][1]+df[i][2]==10&&(!y[i + 1][1]))    break;
                d[i]=df[i][1]+df[i][2];
                if(d[i]==10)    d[i]+=df[i+1][1];
            }
        }
        for(int i=1;i<=zl;i++) {
            if(d[i]==0)    break;
            cout<<d[i]<<' ';
        }
        puts("");int ans=0;
        for(int i=1;i<=zl;i++){
            if(d[i]==0)    break;
            ans+=d[i];
            cout<<ans<<' ';
        }
    }
     
    细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
  • 相关阅读:
    js键盘事件
    jq 插件写法
    js 去除字符串空白符
    C# ExpandoObject用法
    C# dynamic与var的区别
    c# 可选参数与命名实参
    C# 扩展方法
    python运算符
    【HDOJ】3006 The Number of set
    【HDOJ】3205 Factorization
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/9193063.html
Copyright © 2011-2022 走看看