zoukankan      html  css  js  c++  java
  • HUTXXXX Bet 模拟,取余

    这个题在于唯一确定好色子的状态,其实只要知道了色子的前上右分别的点数,也就唯一确定了色子的状态,我们可以根据这三个状态来恢复整个色子的六个面的情况。

    这题还要注意对4进行取模(由于本身已经占了一个格子,因此要减1),直接模拟的话很有可能超时,利用switch的贯穿性质可以让我们的代码过程更加舒适。

    代码如下:

    #include <cstdlib>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    int N, M, ti;
    long long int sum;
    
    struct Node
    {
        int u, f, r;
    }pos, info[4];
    
    void update(int x, int f)
    {
        int bo, ba, l;
        bo = 7 - pos.u;
        ba = 7 - pos.f;
        l = 7 - pos.r;
        sum += ti * (pos.u + pos.r + bo + l);
        if (f & 1) {
            switch (x) {  // 具有贯穿性质
                case 3: {
                    info[3].u = pos.r;
                    info[3].r = bo;
                    sum += info[3].u;
                }
                case 2: {
                    info[2].u = bo;
                    info[2].r = l;
                    sum += info[2].u;
                }
                case 1: {
                    info[1].r = pos.u;
                    info[1].u = l;
                    sum += info[1].u;
                }
                case 0: {
                    info[0].u = pos.u;
                    info[0].r = pos.r;
                    sum += pos.u;
                }
            }
        }
        else {
            switch (x) {
                case 3: {
                    info[3].r = pos.u;
                    info[3].u = l;
                    sum += info[3].u;
                }
                case 2: {
                    info[2].u = bo;
                    info[2].r = l;
                    sum += info[2].u;
                }
                case 1: {
                    info[1].u = pos.r;
                    info[1].r = bo;
                    sum += info[1].u;
                }
                case 0: {
                    info[0].u = pos.u;
                    info[0].r = pos.r;
                    sum += pos.u;
                }
            }
        }
        pos.u = info[x].u;
        pos.r = info[x].r;
        bo = 7 - pos.u;
        ba = 7 - pos.f;
        l = 7 - pos.r;
        pos.f = pos.u;
        pos.u = ba;
    }
    
    void roll()
    {
        int bo, ba, l;
        for (int i = 1; i <= N; ++i) {
            if (i & 1) {
                update(M, 1); // 当行数是奇数的时候是向右滚 
            }
            else {
                update(M, 0);
            }
        }
    }
    
    int main()
    {
        while (scanf("%d %d", &N, &M) == 2) {
            ti = (M - 1) / 4;
            M = (M - 1) % 4; // 循环节是4
            pos.u = 1, pos.f = 2, pos.r = 3;
            sum = 0, roll(); 
            printf("%I64d\n", sum);      
        }
        return 0;
    }
  • 相关阅读:
    字符编码、文件处理
    列表、字典、元祖、集合
    数字类型、字符串、列表
    学习python的第一天作业
    python基础day2-函数基础2,2019-6-25
    python基础day2-函数基础,2019-6-25
    python基础day2-文件处理,2019-6-25
    python基础day2-流程控制,2019-6-25
    python基础day2-字典类型已内置方法,2019-6-25
    python基础day2-可变类型与不可变类型,2019-6-25
  • 原文地址:https://www.cnblogs.com/Lyush/p/2605825.html
Copyright © 2011-2022 走看看