• 蓝桥杯省赛备战笔记—— (五)快速提升代码能力———练习题


    例题:矩阵旋转

    给出一个n X m的整数矩阵,请你把这个矩阵顺
    时针旋转90°以后输出。
    输入格式
    第- -行输入两个整数n,m(1 < n,m≤200),
    用空格隔开。
    接下来n行,每行输入m个整数,表示输入的矩
    阵。矩阵中元素都是int范围内的整数。
    输出格式
    输入m行,每行n个空格隔开的整数,表示旋转
    以后的矩阵。注意:每行末尾不能输出多余的空
    格。

    #include<stdio.h>
    int a[205][205];
    int main(){
        int n,m;
        scanf("%d %d",&n,&m);
        for(int i = 0; i< n;i++){
            for(int j = 0;j < m;j++){
                scanf("%d",&a[i][j]);
            }
        }
        for(int i = 0;i < m;i++){
            for(int j = 0 ;j < n;j++){
                if(j != n-1){
                    printf("%d ",a[n - 1 - j][i]);
                }else{
                    printf("%d
    ",a[n - 1 - j][i]);
                }
            }
        }
        return 0;
    }

     例题:最大子阵

    #include<stdio.h>
    int a[55][55];
    int main(){
        int n,m;
        scanf("%d %d",&n,&m);
        for(int i = 0; i< n;i++){
            for(int j = 0;j < m;j++){
                scanf("%d",&a[i][j]);
            }
        }
        int ans = -1005;
        for(int up = 0;up < n;up++){
            for(int down = up;down < n;down++){
                for(int left = 0;left < m;left++){
                    for(int right = left;right < m;right++){
                        int tmp = 0;
                        for(int p = up;p <= down;p++){
                            for(int q = left ;q <= right;q++){
                                tmp += a[p][q];
                            }
                        }
                        if(tmp > ans)
                            ans = tmp;
                    }
                }
            }
        }
        printf("%d",ans);
        return 0;
    }

     例题:蒜头君的随机数

    蒜头君想在学校中请一些同学- 起做一 项问卷调
    查,为了确保实验的客观性,他先用计算机生成了
    n(1≤n≤100) 个1到1000之间的随机整
    数,对于其中重复的数字,只保留一一个,把其余相
    同的数去掉,不同的数对应着不同的学生的学号。
    然后再把这些数从小到大排序,按照排好的顺序去
    找同学做调查。
    请你协助蒜头君完成“去重”与“排序” 的工作。
    输入格式
    共两行,第- -行为一个正整数n。
    第二行有n个用空格隔开的正整数,为所产生的随
    机数。
    输出格式

    第一行输出一一个正整数m,表示不相同的随机数的
    个数。第二行输出m个用空格隔开的正整数,为
    从小到大排好序的不相同的随机数。

     

    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    int a[1005] = {0};
    int main(){
        int n,m;
        scanf("%d",&n);
        int c = 0;
        for(int i = 0; i < n;i++){
            scanf("%d",&m);
            if(a[m] == 1){
                c++;
            }else{
                a[m] = 1;
            }
        }
        printf("%d
    ",n-c);
        int f = 0;
        for(int i = 0 ;i < 1005;i++){
            if(a[i] == 1){
                if(f)
                    printf(" %d",i);
                else{
                    printf("%d",i);
                    f = 1;
                }
            }
        }
        return 0;
    }

     例题:交叉排序

    蒜头君很无聊,现在有N个数,其中第
    i(1≤i≤N)个数是Ai。

    请输出A排序后的最终结果。
    输入格式
    第一行五个整数
    N,l1,r1,l2,r2(l1 <r1,l2 < r2),均不超过
    100000。
    第二行N个不超过int范围的整数,表示A数
    组。
    输出格式

    -行N个用空格分隔的整数,表示A排序以后的
    结果。
    样例输入
    6 1 3 2 4
    8 3 1 6 9 2
    样例输出

    1 8 6 3 9 2

    #include<stdio.h>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    int a[10005];
    int main(){
        int n,l1,r1,l2,r2;
        scanf("%d %d %d %d %d",&n,&l1,&r1,&l2,&r2);
        for(int i = 1; i <= n;i++){
            scanf("%d",&a[i]);
        }
        sort(a+l1,a+r1+1);
        sort(a+l2,a+r2+1,greater<int>());
        int f = 0;
        for(int i = 1 ;i <= n;i++){
            if(f)
                printf(" %d",a[i]);
            else{
                printf("%d",a[i]);
                f = 1;
            }
        }
        return 0;
    }

     例题:进制转换

     输出: 1B

    #include<stdio.h>
    char a[105];
    int main(){
        int n,r;
        scanf("%d %d",&n,&r);    
        if(n < 0){
            n = - n;
            printf("-");
        }
        int m = 0;
        int now;
        while(n){
            now = n % r;
            if(now <= 9){
                a[m] = now + '0';
            }else{
                a[m] = now - 10 + 'A'; 
            }
            n /= r;
            m++;
        }
        if(m == 0)
            printf("0");
        for(int i = m -1 ;i >= 0;i--){
            printf("%c",a[i]);
        }
        return 0;
    }

     例题:回文数

    -个正整数,如果交换高低位以后和原数相等,那
    么称这个数为回文数。比如121,2332都是回文
    数,13, 4567不是回文数。
    任意-个正整数,如果其不是回文数,将该数交换
    高低位以后和原数相加得到一个新的数,如果新数
    不是回文数,重复这个变换,直到得到一个回文数
    为止。例如,57变换后得到132(57 + 75),132
    得到363(132 + 231),363是一个回文数。
    曾经有数学家猜想:对于任意正整数,经过有限次
    上述变换以后,- -定能得出一个回文数。至今这个
    猜想还没有被证明是对的。现在请你通过程序来验
    证。
    输入格式
    输入-行-一个正整数n.

    输出格式
    输出第一行-一个正整数,表示得到-个回文数的最
    少变换次数。
    接下来一行,输出变换过程,相邻的数之间
    用"--->”连接。输出格式可以参见样例。
    保证最后生成的数在int范围内。

     

    #include<stdio.h>
    int num[105];
    int dig[105];
    bool judge(int x){   //判断是否回文数
        int cnt = 0;
        while(x){
            dig[cnt++] = x % 10;
            x /= 10;
        }
        for(int i = 0; i< cnt /2;i++){
            if(dig[i] != dig[cnt - 1 - i]){
                return false;
            }
        }
        return true;
    }
    int rev(int x){  // 反转函数
        int ret = 0;
        while(x){
            ret = ret * 10 + x % 10;
            x /= 10;
        }
        return ret;
    }
    int main(){
        int n,m;
        scanf("%d",&n);
        m = 0;
        num[m++] = n;
        while(!judge(n)){
            n += rev(n);
            num[m++] = n;
        }
        printf("%d
    ",m - 1);
        for(int i = 0;i < m;i++){
            if(i != m - 1){
                printf("%d--->",num[i]);
            }else{
                printf("%d",num[i]);
            }
        }
        return 0;
    }

    例题:机器人

     

    输入格式
    第一行输入-个整数n(1≤n≤100)表示指令
    的个数。
    接下里n行,每行输入形如上面的指令,其中
    -.1000<x<1000。
    输出格式
    输出两个整数x, y表示机器人最后坐标。用空格
    隔开。

    样例输入
    10
    back -9
    left 3
    left 8
    back 15
    right 10
    right -7
    right -3
    left 11
    right 17
    left 3
    样例输出
    9 -7

    #include<stdio.h>
    int dx[4] = {0,-1,0,1};//forward  left back  right  
    int dy[4] = {1,0,-1,0};
    char a[15]; //op
    int main(){
        int n,d,x;
        scanf("%d",&n);
        int nowx = 0;
        int nowy = 0;
        d = 3; //初始所朝的方向【假定:当命令为forward 时,x坐标+1,y坐标不变,显然是dx[3],dy[3]分别代表的 1 0】 
        while(n--){
            scanf("%s %d",a,&x);
            if(a[0] == 'b'){
                d = (d + 2) % 4; //当前的方向d,指 下一条指令为 forward n时,x,y坐标的加减变化,对于与dx[4],dy[4]的 +/-/0 ---- 加/减/不变 
            }else if(a[0] == 'l'){ //方便计算当前的坐标nowx nowy 
                d = (d + 1) % 4;
            }else if(a[0] == 'r'){
                d = ( d + 3) % 4;
            }
            nowx += dx[d] * x;
            nowy += dy[d] * x;
        }
        printf("%d %d",nowx,nowy);
        return 0;
    }
  • 相关阅读:

    python 爬取可用
    安装完出现Deprecated: Function ereg_replace() is deprecated in
    mysql数据库还原出错ERROR:Unknown command ‘\’解决手记
    mysql 常用语句
    This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery 解决方法
    js 中 json对象 与 json字符串 间相互转换
    神器 Sublime Text 3 的一些常用快捷键
    神器 Sublime Text 3 的一些常用插件
    apache php gzip压缩输出的实现方法
  • 原文地址:https://www.cnblogs.com/expedition/p/12330848.html
Copyright © 2020-2023  润新知