CCF 1158. 骰子游戲
阿新 • • 發佈:2020-12-11
題目描述
滾骰(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; }