GESP 2025年3月C++ 4级 真题与解析

答案:A

解析:函数在main()前声明了就可以定义在main()后。

答案:B

解析:先执行func(),输出局部变量x=20,然后输出全局变量x=10

答案:B

解析:p为指向a的指针,*p可直接访问a,所以*p=20相当于a=20。

答案:D

解析:引用传递和指针传递都是传递地址,不会拷贝参数对象。

答案:D

解析:swap中传入了y的引用,所以y的值被改为了x的值,x并未被修改。

答案:C

解析:A,结构体里没有定义构造函数,所以不能这么写。B,name后面写了逗号,应该是分号。C,对的。D,和A差不多,且不能用new,new返回指针,这里的p不是指针。

答案:D

解析:嵌套层次应当合理,不宜超过3层。否则会影响代码的可读性、可维护性,以及编译效率。

答案:D

解析:第2行第3列。

答案:B

解析:一眼分辨

答案:B

解析:结果就是前两层的方法数量的合计,所以要么B要么D;D:执行完后f1=f2=res,所以B是对的。

答案:B

解析:第一个循环:2n次,第二个循环n次。

答案:B

解析:只有B

答案:A

解析:升序排序,将最大的冒到最后,或最小的冒到最前面,所以第一轮要么1在最前面,要么8在最后面,现在只有A和B,说明是移动最大的到后面,所以第一轮就是5和3比,交换,5和8比,不变,8和1比,交换,得3,5,1,8。

答案:A

解析:a=10,b=-10,所以执行第3行,被15行捕获并输出。

答案:C

解析:ofstream不能用cout。除非做了条件编译,比如:#define outFile cout。

答案:T

解析:如题所述

答案:F

解析:不可以,没有默认类型。

答案:T

解析:如题所述

答案:F

解析:p的值是0x7ffee4065824,p指向1

答案:F

解析:二维数组作为函数参数时,第一维可以省略,第二维(及更高维)必须显式指定。

答案:T

解析:如题所述

答案:T

解析:这题是语文题,T(n)指的是复杂度,所以n个数字的这轮排序复杂度是n,不是n-1。

答案:F

解析:最好情况为O(n),插入排序在 已有序数组 上只需遍历一次,每次仅需 1 次比较 确认位置,无需额外操作。

答案:F

解析:选择最小的,然后交换当前位置,所以是1,3,4,5,2。

答案:T

解析:如题所述

代码示例:

//选择清扫杂物后可以释放最多荒地的点

#include<bits/stdc++.h>

 using namespace std;

 const int N = 1005;

 char mat[N][N];                            //地图

 int a[N][N];                               //a[i][j]:点(i,j)可以释放荒地的数量

 const int d[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};

 int main() {

    int n, m, ans = 0;

    scanf("%d%d", &n, &m);

    assert(1 <= n && n <= 1000);

    assert(1 <= m && m <= 1000);

    for (int i = 1; i <= n; i ++)

        scanf("%s", mat[i] + 1);            //输入地图,从第二行第二列开始输入,空出第一行第一列,就免去判断上边界和左边界

    for (int i = 1; i <= n; i ++)

        for (int j = 1; j <= m; j ++) {

            int num = 0, p = -1;            //p:当前点周围有'#'的点的方向,num:当前点周围有'#'的点的数量

            for (int k = 0; k < 4; k ++)    //遍历四个方向    

                if (mat[i + d[k][0]][j + d[k][1]] == '#')   //当前点周围有'#'

                    num ++, p = k;              //如果只有一个'#',正好记录这个方向

            if (mat[i][j] == '.' && num == 1)   //当前点周围有杂物且周围只有一个杂物

                a[i + d[p][0]][j + d[p][1]] ++; //表示如果清扫这个杂物,可以释放当前这个荒地,因为如果有1个以上的杂物,即使清扫了其中一个,也不能释放这个荒地

            else if (mat[i][j] == '.' && num == 0)

                ans ++;                         //当前点周围没有'#',可开垦的数量加一

            else if (mat[i][j] == '#' && num == 0)

                a[i][j] ++;                     //当前这个'#'的点如果被清扫,也可以释放一个荒地

        }

    int mx = 0;

    for (int i = 1; i <= n; i ++)

        for (int j = 0; j <= m; j ++)

            mx = max(mx, a[i][j]);              //mx:可以释放的荒地的最大值

    cout << ans + mx << endl;

    return 0;

 }

代码示例:

#include <bits/stdc++.h>

 using namespace std;

 const int N = 505;

 int n, m;

 int a[N][N];

 int ans;

 int main() {

    scanf("%d%d", &n, &m);

    assert(1 <= n && n <= 500 && 1 <= m && m <= 500);

    for (int i = 1; i <= n; i++)

        for (int j = 1; j <= m; j++) {

            scanf("%d", &a[i][j]);

            assert(-100 <= a[i][j] && a[i][j] <= 100);

        }

    //遍历每个二阶矩阵,看是否满足条件

    for (int i = 1; i < n; i++)    

        for (int j = 1; j < m; j++)

            if (a[i][j] * a[i + 1][j + 1] == a[i + 1][j] * a[i][j + 1])

                ans++;

    printf("%d\n", ans);

    return 0;

 }

学编程、玩信奥,微信搜“信奥莫老师”,或关注微信公众号“AI之上-信奥驿站”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值