题解:UVA10550 Combination Lock

· · 题解

本蒻蒟第一篇题解,请大佬见谅,如有问题,还请斧正

我刚看到题目就想到这是一个非常简单的大模拟,就写了一个诗山大模拟(也就是下面的代码),结果一提交发现需要绑定UVA账号,我本人当时直接蒙了

题目翻译(来自AI)

‌UVA 10550-密码锁(Combination Lock)‌

‌题目描述:

你有一个密码锁,初始位置为 0。要打开它,需要按照以下步骤操作:

  1. 顺时针旋转两圈‌(720 度)

  2. 继续顺时针旋转‌,直到到达第一个目标数字(记为 first

  3. 逆时针旋转一圈‌(360 度)

  4. ‌继续逆时针旋转‌,直到到达第二个目标数字(记为 second

  5. 最后顺时针旋转‌,直到到达第三个目标数字(记为 third

‌输入格式: ‌

每行输入四个整数:

起始位置(0\le start\le39

第一个目标数字 first0\le first\le39

第二个目标数字 second0\le second\le39

第三个目标数字 third0\le third\le39

输入以四个 0 结束。 ‌输出格式:‌

对于每组输入,输出转动密码锁所需的总度数(整数)。

解题思路

首先,无论密码是多少,你必须要转三整圈,所以结果一定是大于 360\times3 的,也就是 1080 度,密码锁一圈有四十个格子,所以一个格子是九度。

可以先将结果初始化为 1080 度,这样后面就可以不用管先转两圈顺时针后转一圈逆时针了。

然后就到了比较需要你进行巴巴博弈的地方了。

从初始位置 (start) 到第一个密码 (first) 的位置时,如果 start\ge first,那么你只需要转 (start-first)\times9 度;反之,则在转的时候需经过零刻度线,需转 [40-(start-first)]\times9 度。

随后,从第一个密码 (first) 到第二个密码 (sacond) 时需要注意是逆时针转而不是和第一次一样,如果 first\ge second,那么你在转的时候会过零刻度线,所以需要转 [40-(first-second)]\times9 度,反之转 (second-first)\times9 度。

第三步是转第三个密码,转第三个密码和转第一个密码是一样的思路和过程,可以参考转第一个密码的代码。

输入结束是以四个零结束,只需要用 while 循环实现输入,读到四个零就结束。

最后的最后就是提交代码,但你可能会发现“什么?!需要绑定 UVA!”

代码如下

#include<bits/stdc++.h>
using namespace std;
int main(){
    long long start,first,second,third,sum;
    while(cin>>start>>first>>second>>third){
        if(start==0&&first==0&&second==0&&third==0){
            return 0;//题目是以0 0 0 0结尾
        }
        sum=1080;
        if(start>=first){
            sum+=(start-first)*9;
        }else{
            sum+=(40-(first-start))*9;
        }
        if(first>=second){
            sum+=(40-(first-second))*9;
        }else{
            sum+=(second-first)*9;
        }
        if(second>=third){
            sum+=(second-third)*9;
        }else{
            sum+=(40-(third-second))*9;
        }
        cout<<sum<<endl;
    }
    return 0;
}