1 条题解

  • 0
    @ 2025-9-17 17:47:34

    达拉崩吧斑得贝迪卜多比鲁翁 vs 昆特牌提琴烤蛋挞苏打马拉松

    本人还挺喜欢这道题的,所以写个题解 绝对不是因为写的爽

    本题唯一难点在于输入,这个解决了都好做,不得不吐槽一下C语言的字符串输入真是太烂了

    另外,题目有几点没说清楚: 1.你不需要判断这是第几招,输入的20行分别对应这四招,且顺序和题目描述中的顺序一致 2.每个5x5方格间互不影响 (废话)

    写前你需要先斟酌一下,输入到底是存成字符还是整型。我是存成了字符,一是考虑到后面不会有对其中数字进行运算(大小比较除外,反正也不麻烦),二是输入比较简单

    第一招

    没啥好说的,有很多方法都可以判断攻击方向,这里给出我的方法

            int dir = 0;
            for(int i = 0;i < 5;i++){
                if(attack[i][0] == '1' && attack[i][1] == '1'){
                    dir = 0; break;
                }//横着攻击
            }
            for(int i = 0;i < 5;i++){
                if(attack[0][i] == '1' && attack[1][i] == '1'){
                    dir = 1; break;
                }
            }
    
            for(int i = 0;i < 5;i++){
                for(int j = 0;j < 5;j++){
                    if(dir == 0){ //竖着回击
                        if(j == 2) defense[i][j] = '1';
                        else defense[i][j] = '0';
                    }
                    else if(dir == 1){
                        if(i == 2) defense[i][j] = '1';
                        else defense[i][j] = '0';
                    }
                }
            }
    

    第二招略

    第三招

    有点难度,但注意到需要更改的格子数比较少,所以我直接定义了三个数组,存坐标的偏移

    int max_num = 0,pos_x = 0,pos_y = 0;
    
            for(int i = 0;i < 5;i++){
                for(int j = 0;j < 5;j++){
                    int num = (int)(attack[i][j] - '0');
                    if(num > max_num){
                        max_num = num;
                        pos_x = i; pos_y = j;
                    }
                }
            }
    
            for(int i = 0;i < 5;i++)
                for(int j = 0;j < 5;j++)
                    defense[i][j] = '0';
            //开始绘制伤害 
            
            int x_shift[12] = {0,1,0,-1,0,1,2,1,0,-1,-2,-1};
            int y_shift[12] = {-1,0,1,0,-2,-1,0,1,2,1,0,-1};
            char pos_value[12] = {'2','2','2','2','1','1','1','1','1','1','1','1'};
            defense[pos_x][pos_y] = '3';
            for(int i = 0;i < 12;i++)
                if(pos_x + x_shift[i] < 5 && pos_y + y_shift[i] < 5 && pos_x + x_shift[i] >= 0 && pos_y + y_shift[i] >= 0)
                    defense[pos_x + x_shift[i]][pos_y + y_shift[i]] = pos_value[i];
    

    第四招略

    输入注意事项

    一般字符串输入还是建议用fgets和scanf_s 这道题不建议用fgets,因为测试点有点奇怪,可能会出一些奇怪的问题

    进一步解释一下fgets和scanf的区别 简单来说,fgets再读字符串的时候会包含空格,遇到换行才停止 scanf遇到空格就会停了

    这道题因为输入的字符串中间并无空格,所以scanf就可以了

    • 1

    信息

    ID
    555
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    62
    已通过
    3
    上传者