题解 | #安卓图案解锁#

安卓图案解锁

https://ac.nowcoder.com/acm/contest/20960/1005

#include<bits/stdc++.h>
using namespace std;
int main(){
    string input;
    int record[10] = { 0 };//0表示未使用,1表示已使用
    int result[1000000] = { 0 };//1表示NO,0表示YES,这个数组一定要开大点
    int num = 0;//num记录共多少组
    while (cin >> input)//每次循环处理一组
    {
        int i = 0;
        int record[10] = { 0 };//0表示未使用,1表示已使用
        while (input[i] != '\0')
        {
            if (i >= 1)
            {
                int big = input[i] > input[i - 1] ? input[i] - 48 : input[i - 1] - 48;
                int small = input[i] < input[i - 1] ? input[i] - 48 : input[i - 1] - 48;
                if (small == 1 && (big == 3 || big == 7 || big == 9 ))
                {
                    if (record[(big + small) / 2] == 0)
                    {
                        result[num] = 1;
                        break;
                    }
                }
                if (small == 2 && big == 8 )
                {
                    if (record[(big + small) / 2] == 0)
                    {
                        result[num] = 1;
                        break;
                    }
                }
                if (small == 3 &&( big == 7 || big == 9 ))
                {
                    if (record[(big + small) / 2] == 0)
                    {
                        result[num] = 1;
                        break;
                    }
                }
                if (small == 4 && big == 6 )
                {
                    if (record[(big + small) / 2] == 0)
                    {
                        result[num] = 1;
                        break;
                    }
                }
                if (small == 7 && big == 9)
                {
                    if (record[(big + small) / 2] == 0)
                    {
                        result[num] = 1;
                        break;
                    }
                }
            }
            if (record[input[i] - 48] == 1)//遇到已使用则NO
            {
                result[num] = 1;
                break;
            }
            else if (record[input[i] - 48] == 0)//未使用则使用它
                record[input[i] - 48] = 1;
            i++;
        }
        num++;
    }
    for (int x = 0; x < num; x++)//根据result数组输出YES或NO
    {
        if (result[x] == 1)
            cout << "NO" << endl;
        else if (result[x] == 0)
            cout << "YES" << endl;
    }
}

本题考察如何将生活中直观的显然的判断抽象成算法逻辑。 本题的算法并不是本质的、透彻的、通用的算法,而是接近枚举的算法。 本题要一次性接受多组输入,需要使用while (cin >> input){}这种结构,同时不能对每组数都立即输出结果,应该将每组结果存放在结果数组中,最后再遍历数组打印。

注:在开辟result数组时应该在要求范围内使其尽可能大,本人之前设1000报告段错误,设为1000000后AC(汗颜)

要明确什么情况下会失败:(1)遇到已经使用过的数(2)序列中相邻两数若有中间数,且中间数未使用。

对于第二种失败情况,本人采用枚举思想,对相邻两项及其中间项进行判断处理。

同时要学会灵活使用string类型,注意数字字符串中的数据和真正的数字之间通过+-48进行转换。

全部评论

相关推荐

2025-12-13 14:51
已编辑
井冈山大学 算法工程师
龙虾x:算法比你强的没有你美,比你美的…..算了已经没有比你美的了
工作两年想退休了
点赞 评论 收藏
分享
2025-12-22 21:12
门头沟学院 Java
码农索隆:看得出来,公司对你挺满意哦。 但是你要结合一下自己的职业发展看下,眼光要放长远了看
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务