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

例题:矩阵旋转

给出一个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\n",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",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\n",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;
}

 

posted @ 2020-02-19 15:31  远征i  阅读(368)  评论(0编辑  收藏  举报