蓝桥杯省赛备战笔记—— (五)快速提升代码能力———练习题
例题:矩阵旋转
给出一个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; }