7-6 赛博黑客

7-6 赛博黑客

目录

题目

在赛博朋克2077的夜之城,网络黑客们可以在入侵敌人协议时利用一种被称为“魔偶”的数字序列来渗透控制敌人,而技术高超的网络监察则努力破解这些魔偶代码,以保护关键信息不被窃取。魔偶(长度为k)如果满足对于所有的i (1≤i≤k−1),有a[i]!=a[i+1],则被认为是“稳定”的,能够有效地穿透黑墙的防御。.
例如,1、101、0101都是稳定的魔偶,而11、1001、001100则不是。
作为一名黑客,你发现了一种潜在的攻击方法:将两个魔偶代码组合,通过将一个短代码t插入另一个长代码s的任意位置(可以进行一次或多次操作,也可以不进行操作),来形成一个稳定的魔偶。你的目标是编写一个程序,判断是否有可能通过这种方式将s转化为稳定的魔偶代码,进而入侵敌人。

输入格式:
首先输入一个整数T表示测试案例的数量。
对于每一组测试数据,首先输入两个整数n和m,代表两个幽灵代码的长度。接下来输入两个字符串s和t,代表两个幽灵代码。保证s和t的长度分别为n和m (1≤n,m≤100),且只包含字符0和1。

输出格式:
对于每一组输入数据,在一行中输出答案。如果可以通过上述操作使s成为稳定的幽灵代码,输出"YES";否则,输出"NO"。

输入样例:

5
1 1
0
1
2 2
00
11
7 3
010110
010
5 3
10101
000
7 2
1100110
01

输出样例:

YES
NO
YES
YES
NO

样例解释:
在第一组样例中,魔偶s的代码0已经是稳定的魔偶,可以无需进行操作。
在第三组样例中,对于不稳定的魔偶s的代码010110,可以在第四个位置后插入另一个魔偶t代码010,变为010101010

代码

思路

  1. 首先输入一个整数T表示测试案例的数量。
  2. 对于每一组测试数据,首先输入两个整数n和m,代表两个幽灵代码的长度。接下来输入两个字符串s和t,代表两个幽灵代码。
  3. 定义flag=1表示s稳定,根据a[i]!=a[i+1]判断s是否稳定,若不稳定,则flag=0并跳出判断。
  4. 若flag=1,则无需插入s已经稳定
  5. 若flag=0,则判断插入t后s是否稳定
    a.若t不稳定,则怎么插入都不能使s不稳定
    b.若t的首或尾数字和s的不稳定部位数字相同,则也无法使s稳定

!:若s只有1个元素,则无法且不用根据a[i]!=a[i+1]判断s是否稳定,s就是稳定的
!:考虑到s可能不只有一处不稳定的地方,则
b.若t的首或尾数字和s的不稳定部位数字相同,则也无法使s稳定应在3. 定义flag=1表示s稳定,根据a[i]!=a[i+1]判断s是否稳定,若不稳定,则flag=0并跳出判断。就判断,即:若s不稳定,则判断t的首或尾数字和s的不稳定部位数字是否相同,若相同,则t不能使s稳定并直接跳出循环;若不相同,则继续判断s是否有其他不稳定的地方。
或直接将s不稳定的地方的数字用int a[2]={-1,-1}存储起来,然后判断t的首或尾数字是否和数组a存储的数字相同。

第一次尝试

#include<stdio.h>
int main()
{
    int T;
    scanf_s("%d", &T);
    int n, m;
    char s[100];
    char t[100];
    for (int i = 0; i < T; i++)
    {
        scanf_s("%d%d", &n, &m);
        scanf_s("%s", s, n);
        scanf_s("%s", t, m);
        int s_flag = 1;
        if (n > 1)//s有多个元素
        {
            int a[2] = { -1,-1 };
            for (int j = 0; j < n - 1; j++)//判断s是否稳定
            {
                if (s[j] == s[j + 1])
                {
                    s_flag = 0;//不稳定
                    if (a[0] == -1 && s[j] == 0)
                        a[0] = 0;
                    else if (a[1] == -1 && s[j] == 1)
                        a[1] = 1;
                }
                if (a[0] != -1 && a[1] != -1)
                    break;
            }
            printf("判断s是否稳定:%d\n", s_flag);
            if (s_flag==0)//如果s不稳定,判断能否通过插入t使之稳定
            {
                /*
                1.若t不稳定,则怎么插入都不能使s不稳定
                2.若t的首或尾数字和s的不稳定部位相同,则也无法使s稳定
                */



                int t_flag = 1;//t稳定
                for (int j = 0; j < m - 1; j++)
                {
                    if (t[j] == t[j + 1])//t不稳定
                    {
                        t_flag = 0;//不稳定
                        break;
                    }
                }
                printf("判断t是否稳定:%d\n", t_flag);

                if (t_flag==1)//t稳定
                {
                    int j = 0;
                    for ( ;j < 2; j++)
                    {
                        if (a[j] != -1)
                        {
                            if (t[0] == a[j] || t[m - 1] == a[j])//t的首或尾数字和s的不稳定部位相同
                            { 
                                break;
                            }
                            
                        }
                    }
                    printf("判断t的首或尾数字和s的不稳定部位是否相同:%d\n", j);

                    if (j == 2)//t的首或尾数字和s的所有不稳定部位都不相同
                    {
                        s_flag = 1;
                    }
                }
               
            }
            
        }
        if (s_flag==1)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}
运行结果

错误分析


00明显是不稳定的,但是运行结果中判断s是否稳定:1表明00稳定,所以初步判断判断s是否稳定的代码出错

寻错——判断s是否稳定的代码

运行结果表明成功进入判断


错因:说明字符串的输入出错了


修正

scanf_s("%s",s,sizeof(s))sizeof(s)表示输入字符串最大长度,而不是输入字符串具体长度。

第二次尝试

#include<stdio.h>
int main()
{
    int T;
    scanf_s("%d", &T);
    int n, m;
    char s[100];
    char t[100];
    for (int i = 0; i < T; i++)
    {
        scanf_s("%d%d", &n, &m);
        scanf_s("%s", s, 100);
        scanf_s("%s", t, 100);
        int s_flag = 1;
        if (n > 1)//s有多个元素
        {
            int a[2] = { -1,-1 };
            for (int j = 0; j < n - 1; j++)//判断s是否稳定
            {
                if (s[j] == s[j + 1])
                {
                    s_flag = 0;//不稳定
                    if (a[0] == -1 && s[j] == 0)
                        a[0] = 0;
                    else if (a[1] == -1 && s[j] == 1)
                        a[1] = 1;
                }
                if (a[0] != -1 && a[1] != -1)
                    break;
            }
            printf("判断s是否稳定:%d\n", s_flag);
            if (s_flag==0)//如果s不稳定,判断能否通过插入t使之稳定
            {
                /*
                1.若t不稳定,则怎么插入都不能使s不稳定
                2.若t的首或尾数字和s的不稳定部位相同,则也无法使s稳定
                */



                int t_flag = 1;//t稳定
                for (int j = 0; j < m - 1; j++)
                {
                    if (t[j] == t[j + 1])//t不稳定
                    {
                        t_flag = 0;//不稳定
                        break;
                    }
                }
                printf("判断t是否稳定:%d\n", t_flag);

                if (t_flag==1)//t稳定
                {
                    int j = 0;
                    for ( ;j < 2; j++)
                    {
                        if (a[j] != -1)
                        {
                            if (t[0] == a[j] || t[m - 1] == a[j])//t的首或尾数字和s的不稳定部位相同
                            { 
                                break;
                            }
                            
                        }
                    }
                    printf("判断t的首或尾数字和s的不稳定部位是否相同:%d\n", j);

                    if (j == 2)//t的首或尾数字和s的所有不稳定部位都不相同
                    {
                        s_flag = 1;
                    }
                }
               
            }
            
        }
        if (s_flag==1)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}
运行结果

分析错因


说明t的首或尾数字和s的不稳定部位是否相同的代码错误

寻错——t的首或尾数字和s的不稳定部位是否相同

s不稳定位置的数字没有正确存入a

修改




最终代码

#include<stdio.h>
int main()
{
    int T;
    scanf("%d", &T);
    int n, m;
    char s[100]="\0";
    char t[100]="\0";
    for (int i = 0; i < T; i++)
    {
        scanf("%d%d", &n, &m);
        scanf("%s", s, 100);
        scanf("%s", t, 100);
       // printf("%s\n%s\n", s, t);
        int s_flag = 1;
        if (n > 1)//s有多个元素
        {
            int a[2] = { -1,-1 };
            for (int j = 0; j < n - 1; j++)//判断s是否稳定
            {
                
                if (s[j] == s[j + 1])
                {
                    
                    s_flag = 0;//不稳定
                    int a_i = s[j] - '0';
                    if (a[a_i] == -1)
                    {
                        a[a_i] = a_i;
                        
                    }
                }
                if (a[0] != -1 && a[1] != -1)
                    break;
            }
            
            if (s_flag==0)//如果s不稳定,判断能否通过插入t使之稳定
            {
                /*
                1.若t不稳定,则怎么插入都不能使s不稳定
                2.若t的首或尾数字和s的不稳定部位相同,则也无法使s稳定
                */



                int t_flag = 1;//t稳定
                for (int j = 0; j < m - 1; j++)
                {
                    if (t[j] == t[j + 1])//t不稳定
                    {
                        t_flag = 0;//不稳定
                        break;
                    }
                }
                

                if (t_flag==1)//t稳定
                {
                    int j = 0;
                    for ( ;j < 2; j++)
                    {
                        
                        if (a[j] != -1)
                        {
                            

                            if (t[0] == a[j] || t[m] == a[j])//t的首或尾数字和s的不稳定部位相同
                            { 
                               
                                break;
                            }
                            
                        }
                    }
                   

                    if (j == 2)//t的首或尾数字和s的所有不稳定部位都不相同
                    {
                        s_flag = 1;
                    }
                }
               
            }
            
        }
        if (s_flag==1)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}
运行结果


posted @ 2023-11-30 23:54  刘倩_网安2211  阅读(113)  评论(0编辑  收藏  举报