1 条题解

  • 0

    题意分析

    1. 刻度盘特性4040个刻度,每个刻度间隔99度(360/40=9360/40=9度)
    2. 旋转规则
      • 顺时针22整圈(2×360=7202 \times 360 = 720度)
      • 逆时针11整圈(360360度)
      • 分段旋转计算实际移动的刻度数
    3. 关键点:计算相邻数字间的刻度差时,需要考虑顺时针和逆时针的方向差异

    解题思路

    1. 初始化:读取初始位置pospos和三个密码数字c1,c2,c3c1,c2,c3
    2. 分步计算: a. 顺时针22圈:固定加720720度 b. 从posposc1c1:计算顺时针旋转的刻度差(posc1)mod40(pos - c1) \mod 40,乘以99度 c. 逆时针11圈:固定加360360度 d. 从c1c1c2c2:计算逆时针旋转的刻度差(c2c1)mod40(c2 - c1) \mod 40,乘以99度 e. 从c2c2c3c3:计算顺时针旋转的刻度差(c2c3)mod40(c2 - c3) \mod 40,乘以99
    3. 累加求和:将各步度数相加得到总旋转度数

    实现步骤

    1. 处理输入直到遇到00 00 00 00
    2. 对每个测试用例:
      • 计算第一步固定720720
      • 计算三个密码数字间的分段旋转度数
      • 注意模4040运算处理刻度盘循环特性
    3. 输出总度数

    代码实现

    /* POJ2304 ZOJ1928 UVA10550 Combination Lock */
    
    #include <iostream>
    #include <cstdio>
    
    using namespace std;
    
    const int MN = 40;
    
    int main()
    {
        int p, a, b, c;
        while(~scanf("%d%d%d%d", &p, &a, &b, &c) && (p || a || b || c)) {
            int ans = MN * 3;           // 第1步+第3步共转3圈,每圈40格
            ans += (p - a + MN) % MN;
            ans += (b - a + MN) % MN;
            ans += (b - c + MN) % MN;
            printf("%d\n", ans * 360 / MN);     // 格转度数(360度=40格)
        }
    
        return 0;
    }
    • 1

    信息

    ID
    1305
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者