1. 程式人生 > >洛谷 P1166 打保齡球

洛谷 P1166 打保齡球

style 結束 一個 tool i++ blank bsp 實時 con

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<< ;
    }
}

 

洛谷 P1166 打保齡球