1. 程式人生 > 其它 >CCF 1158. 骰子游戲

CCF 1158. 骰子游戲

技術標籤:c++c++ccf模擬

題目描述

滾骰(tou)子是一件有益身心健康的運動,因此骰子游戲可是一個很受年輕人歡迎的遊戲。現在先介紹一下這個聞名遐邇的骰子游戲吧。
首先是主角:骰子。骰子就是很普通的骰子:骰子有六個面,分別標號1到6,三對面上的數字之和均為7。以下是骰子的一個圖示。

然後我們介紹這個遊戲的地圖:一個R*C的網格圖。骰子一開始的狀態如上圖所示(即上面為 1,下面為 6,左面為 4,右面為 3,前面為 2,後面為 5),且位置在左上角。
然後重頭戲來了,你需要的操作就是滾動骰子。滾動骰子當然是有軌跡的。你需要從左到右滾動到右端,然後向下滾動一格然後在向左滾動到左端,再向下一格,如此反覆…直到最下面一行為止。

遊戲的目的就是請你計算出骰子到達每個格點時,骰子上方的數字之和。

輸入

第一行包含兩個整數 R 和 C。

輸出

第一行包含兩個整數 R 和 C。(注意這裡,題目提示出錯,應該是計算到達所有格子時上面數字之和。)

樣例輸入

3 2

樣例輸出

19

資料範圍限制

對於50%的資料1<=R,C<=100
對於100%的資料 1<=R,C<=100000

提示

第一行包含兩個整數 R 和 C。

思路:

一、使用一個數組記錄骰子每一面的狀態

二、通過奇偶行的較驗,可以模擬骰子是向左還是向右滾動

三、骰子無論向左還是向右,都是四次一迴圈,所以我們模擬的時候,不需要全部模擬(全模擬會超時),只需要把足夠四次迴圈進行固定的計算,而不足四次迴圈的,進行模擬則可

四、注意,對於100%的資料,數字之和會超過int的範圍,所以結果需要使用long long去儲存。

滿分程式碼:

#include<cstdio>
using namespace std;
int n,m,a[6]={1,6,2,5,4,3}; //上 下 前 後 右 左
long long ans;
void gun1(){  //向右轉 
    int t=a[0]; 
    a[0]=a[4];
    a[4]=a[1];
    a[1]=a[5]; 
    a[5]=t;
}
void gun2(){ // 向左轉 
    int t=a[0];
    a[0]=a[5]; 
    a[5]=a[1];  
    a[1]=a[4];  
    a[4]=t;      
}
void gun3(){//向下轉 
    int t=a[0];
    a[0]=a[3]; 
    a[3]=a[1];  
    a[1]=a[2];    
    a[2]=t;     
}
int main(){
    scanf("%d%d",&n,&m);
    --m;  //一放上去是不需要轉的,向下一行也不需要轉,所以可以算少一列
    for (int i=1;i<=n;i++){
        ans+=a[0];  
        //對於達到n次4迴圈,直接計算上面的值就可以了
        ans+=(a[0]+a[1]+a[2]+a[3])*(m/4); 
        //下面計算整數次後的零頭
        if (i%2){  //奇行 
            for(int j=1;j<=m%4;j++){ 
                gun1();
                ans+=a[0];
            }
        }else{  //偶行 
            for(int j=1;j<=m%4;j++){
                gun2();
                ans+=a[0];
            }
        }
        gun3();//一行轉完,向下滾一格
    }
    printf("%lld",ans);
    return 0;
}