c语言 蓝桥杯校内模拟赛

编程入门 行业动态 更新时间:2024-10-05 17:26:52

c语言 蓝桥杯<a href=https://www.elefans.com/category/jswz/34/1766800.html style=校内模拟赛"/>

c语言 蓝桥杯校内模拟赛

本人水平不高,写点东西主要目的是锻炼一下自己巩固一下知识,不喜勿喷,如有发现问题欢迎指正。

一.递增三元组

问题描述
在数列 a[1], a[2], …, a[n] 中,如果对于下标 i, j, k 满足 0<i<j<k<n+1 且 a[i]<a[j]<a[k],则称 a[i], a[j], a[k] 为一组递增三元组,a[j]为递增三元组的中心。
给定一个数列,请问数列中有多少个元素可能是递增三元组的中心。
输入格式
输入的第一行包含一个整数 n。
第二行包含 n 个整数 a[1], a[2], …, a[n],相邻的整数间用空格分隔,表示给定的数列。
输出格式
输出一行包含一个整数,表示答案。
样例输入
5
1 2 5 3 5
样例输出
2
样例说明
a[2] 和 a[4] 可能是三元组的中心。
评测用例规模与约定
对于 50% 的评测用例,2 <= n <= 100,0 <= 数列中的数 <= 1000。
对于所有评测用例,2 <= n <= 1000,0 <= 数列中的数 <= 10000。

思路分析:循环然后标记所有满足a[i]<a[j]<a[k]中j的位置并输出

#include<stdio.h>void main ()
{int num,i,j,k,m;int arraynum[10000];int result[10000];scanf("%d",&num);for(i= 0;i<num;i++){scanf("%d",&arraynum[i]);}m=0;for(i=0;i<num-2;i++){for(j=1;j<num-1;j++){for(k=2;k<num;k++){if(arraynum[i]<arraynum[j]&&arraynum[j]<arraynum[k]){result[j] = 1;}}}}for(i = 0 ; i<=num;i++){if(result[i]==1)printf("%d ",arraynum[i]);}}

小结:遇到的第一个问题就是怎样控制输入的数组长度,后来想到其实只要确定了数组的大小提前分配好空间之后就能用循环来控制了。之后就是用一个标记数组的时候卡了一下,想通了还是挺简单的。

二.数位递增问题
问题描述
  一个正整数如果任何一个数位不大于右边相邻的数位,则称为一个数位递增的数,例如1135是一个数位递增的数,而1024不是一个数位递增的数。
  给定正整数 n,请问在整数 1 至 n 中有多少个数位递增的数?
输入格式
  输入的第一行包含一个整数 n。
输出格式
  输出一行包含一个整数,表示答案。
样例输入
30
样例输出
26
评测用例规模与约定
  对于 40% 的评测用例,1 <= n <= 1000。
  对于 80% 的评测用例,1 <= n <= 100000。
  对于所有评测用例,1 <= n <= 1000000。

思路分析:暴力枚举,写一个判断函数,将进来的数据按照位数存入数组,然后判断前一位和后一位的大小关系,符合条件则计数加1。

#include<stdio.h>
int ary[10];
int judge(int n)
{int len = 0;int i;int m = 0;while(n){ary[len] = n % 10;len++;n /= 10;}for(i=len-1;i>0;i--)if(ary[i]>ary[i-1]) return 0;return 1;
}
void main()
{int i;int input;int num=0;scanf("%d",&input);for(i = 1; i<=input;i++)if(judge(i)) num++;printf("%d",num);
}

3.长草
问题描述
小明有一块空地,他将这块空地划分为 n 行 m 列的小块,每行和每列的长度都为 1。
小明选了其中的一些小块空地,种上了草,其他小块仍然保持是空地。
这些草长得很快,每个月,草都会向外长出一些,如果一个小块种了草,则它将向自己的上、下、左、右四小块空地扩展,这四小块空地都将变为有草的小块。
请告诉小明,k 个月后空地上哪些地方有草。
输入格式
输入的第一行包含两个整数 n, m。
接下来 n 行,每行包含 m 个字母,表示初始的空地状态,字母之间没有空格。如果为小数点,表示为空地,如果字母为 g,表示种了草。
接下来包含一个整数 k。
输出格式
输出 n 行,每行包含 m 个字母,表示 k 个月后空地的状态。如果为小数点,表示为空地,如果字母为 g,表示长了草。
样例输入
4 5
.g…

…g…

2
样例输出
gggg.
gggg.
ggggg
.ggg.
评测用例规模与约定
对于 30% 的评测用例,2 <= n, m <= 20。
对于 70% 的评测用例,2 <= n, m <= 100。
对于所有评测用例,2 <= n, m <= 1000,1 <= k <= 1000。

思路分析:首先这道题需要两个数组。一个放‘g’,另一个存放长草的时间,即是新草还是旧草,结合这两个情况判断是否往四周长草,再考虑草所处的位置,判断怎样长草。对此我们编写一个长草的函数即可,需要注意的是当两个草长草相互覆盖时,要注意判断时间的先后。

#include<stdio.h>
char cao[1005][1005];
int time[1005][1005];void grow(int round,int length,int width){int i;int j;for(i=0;i<length;i++)for(j=1;j<=width;j++){if(cao[i][j]=='g'&&time[i][j]==round){if(i==0&&j==1){cao[i+1][j]=cao[i][j+1]='g';if(time[i+1][j]!=round)time[i+1][j]=round+1;if(time[i][j+1]!=round)time[i][j+1]=round+1;}else if(i==0&&j==width){cao[i+1][j]=cao[i][j-1]='g';if(time[i+1][j]!=round)time[i+1][j]=round+1;if(time[i][j-1]!=round)time[i][j-1]=round+1;}else if(i==length-1&&j==width){cao[i-1][j]=cao[i][j-1]='g';if(time[i-1][j]!=round)time[i-1][j]=round+1;if(time[i][j-1]!=round)time[i][j-1]=round+1;}else if(i==length-1&&j==1){cao[i-1][j]=cao[i][j+1]='g';if(time[i-1][j]!=round)time[i-1][j]=round+1;if(time[i][j+1]!=round)time[i][j+1]=round+1;}else if(i==0){cao[i+1][j]=cao[i][j+1]=cao[i][j-1]='g';if(time[i+1][j]!=round)time[i+1][j]=round+1;if(time[i][j+1]!=round)time[i][j+1]=round+1;if(time[i][j-1]!=round)time[i][j-1]=round+1;}else if(j==1){cao[i+1][j]=cao[i][j+1]=cao[i-1][j]='g';if(time[i+1][j]!=round)time[i+1][j]=round+1;if(time[i][j+1]!=round)time[i][j+1]=round+1;if(time[i-1][j]!=round)time[i-1][j]=round+1;}else if(i==length-1){cao[i-1][j]=cao[i][j+1]=cao[i][j-1]='g';if(time[i][j-1]!=round)time[i][j-1]=round+1;if(time[i][j+1]!=round)time[i][j+1]=round+1;if(time[i-1][j]!=round)time[i-1][j]=round+1;}else if(j==width){cao[i-1][j]=cao[i][j-1]=cao[i+1][j]='g';if(time[i][j-1]!=round)time[i][j-1]=round+1;if(time[i+1][j]!=round)time[i+1][j]=round+1;if(time[i-1][j]!=round)time[i-1][j]=round+1;}else {cao[i+1][j]=cao[i][j+1]=cao[i-1][j]=cao[i][j-1]='g';if(time[i][j-1]!=round)time[i][j-1]=round+1;if(time[i+1][j]!=round)time[i+1][j]=round+1;if(time[i-1][j]!=round)time[i-1][j]=round+1;if(time[i][j+1]!=round)time[i][j+1]=round+1;}}}
}
void main ()
{int i,j;int lth;int wth;int rond;scanf("%d",&lth);scanf("%d",&wth);for(i=0;i<lth;i++){for(j=0;j<=wth;j++){scanf("%c",&cao[i][j]);}}scanf("%d",&rond);for(i=0;i<lth;i++){for(j=0;j<=wth;j++){if(cao[i][j]=='g')time[i][j]=1;}}for(i=1;i<=rond;i++){	grow(i,lth,wth);}for(i=0;i<lth;i++){for(j=1;j<=wth;j++){printf("%c",cao[i][j]);}printf("\n");}}

小结:呼应一下开头所说的本人水平不高,基本就是一个初学者的状态,这段代码虽然思路比较简单,但是我自己也感觉比较繁琐,肯定有很多更加简单的思路,优秀的各位就不用学我了。
这里我再复习一下代码调试的操作,毕竟我连回车要占用一个数组空间我都忘记了,要不是回想了一下怎么debug,这段代码我估计是写不出来了。

首先在一个合适的位置打下断点

然后开始调试,输入变量后回车

在监视区域添加监视的变量

然后过程运行 单步运行都可以。这里我直接F10,即长草一次,变化的地方会用红色标注出来


[1][0]这个位置是被回车占用的地方。需要注意!

谢谢各位,欢迎大神指点,以及不要喷我。

更多推荐

c语言 蓝桥杯校内模拟赛

本文发布于:2024-02-27 22:52:31,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1766377.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:校内   语言   蓝桥杯

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!