电子学会青少年软件编程(C语言五级)等级考试真题试卷(2022年3月)-附答案_第1页
电子学会青少年软件编程(C语言五级)等级考试真题试卷(2022年3月)-附答案_第2页
电子学会青少年软件编程(C语言五级)等级考试真题试卷(2022年3月)-附答案_第3页
电子学会青少年软件编程(C语言五级)等级考试真题试卷(2022年3月)-附答案_第4页
电子学会青少年软件编程(C语言五级)等级考试真题试卷(2022年3月)-附答案_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

青少年软件编程(C语言五级)等级考试真题试卷(2022年3月)

题目总数:4

总分数:100

时间:不限时

第1题

数字变换

问答题

给定一个包含5个数字(0-9)的字符串,例如"02943",请将"12345"变换到它。你可以采取3种操作进行

变换

1.交换相邻的两个数字

2.将一个数字加1。如果加1后大于9,则变为0

3.将一个数字加倍。如果加倍后大于9,则将其变为加倍后的结果除以10的余数。

最多只能用第2种操作3次,第3种操作2次求最少经过多少次操作可以完成变换。

时间限制:1000

内存限制:65536

输入

有最多100,000组数据每组数据就是包含5个数字的字符串

输出

对每组数据,输出将"12345"变换到给定字符串所需要的最少操作步数。如果无法变换成功,输出-1

样例输入

12435

99999

12374

样例输出

1

-1

3

提示

由于测试数据太多,如果对每组数据都从头进行搜索,就会超时。建议先做预处理,即以"12345"作为初始

状态做一遍彻底的广搜,找出"12345"经合法变换能够到达的所有字符串,并记录到达这些字符串各需要多

少步操作。然后对读入的每组数据,在上述预处理记录的结果中进行查询即可。

答案

参考答案1

#include<iostream>

#include<algorithm>

#include<cstring>

#include<queue>

usingnamespacestd;

#define_init(x,v)memset(x,v,sizeof(x))

intrcd[100000];

boolvis[100000][5][5];

structnode{

inta[5],d,o2,o3;

};

queue<node>q;

voidin(){

_init(rcd,-1);

nodes={1,2,3,4,5,0,3,2};

q.push(s);

vis[12345][3][2]=1;

rcd[12345]=0;

}

inttoNum(node&n){

intt=0;

for(inti=0;i<5;++i){

t*=10;

t+=n.a[i];

}

returnt;

}

voidbfs(){

while(!q.empty()){

nodes=q.front();

intt=toNum(s);

if(rcd[t]==-1||rcd[t]>s.d)rcd[t]=s.d;

//printf("n=%d,d=%d,o2=%d,o3=%d\n",toNum(s),s.d,s.o2,s.o3);

++s.d;

q.pop();

for(inti=0;i<5;++i){

//o1

if(i<4&&s.a[i]!=s.a[i+1]){

swap(s.a[i],s.a[i+1]);

if(!vis[toNum(s)][s.o2][s.o3]){

vis[toNum(s)][s.o2][s.o3]=1;

q.push(s);

第2题

寻找边缘

问答题

给定一张R*C的地图,由"X"和"O"组成。

现在需要重新处理这张地图,找到地图边缘的那些"O"。你需要将这些地图边缘上的"O"保留下来,然后将

其他的"O"全部替换为"X"。

地图边缘的"O"指的是那些处于第一行/列或最后一行/列上的"O",以及从这些"O"的相邻位置(上下左右)

延伸出去的"O"。

时间限制:1000

内存限制:65536

输入

第一行是一个正整数T,表示一共有T组数据。对于每组数据,其第一行是两个正整数R和C,表示地图

的大小,用一个空格分开。接下来的R行,每行包含了C个字符,分别是"X"或"O"。其中,0<T<=

10,0<R,C<=500。

输出

对于每组数据,输出R行,每行包含了C个字符,分别是"X"或"O"。每组数据之间需要额外输出一个空

行。

样例输入

2

23

OXX

XXO

55

XXXOX

XXXOX

XOOXX

XXOXX

XOXXX

样例输出

OXX

XXO

XXXOX

XXXOX

XXXXX

XXXXX

XOXXX

答案

#include<iostream>

#include<cstring>

usingnamespacestd;

intr,c;

chara[505][505];

intdirx[4]={0,0,1,-1};

intdiry[4]={1,-1,0,0};

voiddfs(intx,inty){

for(inti=0;i<4;i++){

intnx=x+dirx[i];

intny=y+diry[i];

if(a[nx][ny]=='O'){

a[nx][ny]='?';

dfs(nx,ny);

}

}

}

intmain(){

intt;

cin>>t;

while(t--){

memset(a,0,sizeof(a));

cin>>r>>c;

inti,j;

for(i=1;i<=r;i++)

for(j=1;j<=c;j++)

cin>>a[i][j];

for(i=1;i<=r;i++){

if(a[i][1]=='O'){

a[i][1]='?';

dfs(i,1);

}

if(a[i][c]=='O'){

a[i][c]='?';

dfs(i,c);

}

}

for(i=1;i<=c;i++){

if(a[1][i]=='O'){

a[1][i]

第3题

42点

42是:

问答题

•组合数学上的第5个卡特兰数

•字符'*'的ASCII码

•钼的原子序数

•6与9的乘积结果的13进制表示

•生命、宇宙以及任何事情的终极答案

•以及表达式(1+5)/2*(6-4)*7的值

因此,小机器人Marvin发明了这个叫42点的小游戏。在这个游戏中,玩家会获得n个数。玩家需要使

用'+'、'-'、'*'、'/'、'('、')'以及这n个数构成一个合法的中缀表达式,并使得该表达式的值为42。n个数

之间的顺序可以改变。表达式运算过程中只能出现整数。

由于过于抑郁,Marvin无力完成这个游戏,于是来找你帮忙。你的任务是对于给定的n个数,判断他们是

否能根据上述游戏规则算出42。

时间限制:1000

内存限制:65536

输入

第一行为一个数n,1<=n<=6。第二行为n个数,每个数均为[1,13]范围内的整数。

输出

输出一行,若可以算出42则输出"YES",否则输出"NO"(注意大小写)。

样例输入

6

152647

样例输出

YES

答案

#include<iostream>

usingnamespacestd;

booldfs(inta[],intn){

if(n==1){

returna[0]==42;

}

for(inti=0;i<n;++i){

for(intj=i+1;j<n;++j){

intb[10];

intm=0;

for(intk=0;k<n;++k){

if(k==i||k==j)continue;

b[m++]=a[k];

}

++m;

b[m-1]=a[i]+a[j];if(dfs(b,m))return1;

b[m-1]=a[i]-a[j];if(dfs(b,m))return1;

b[m-1]=a[j]-a[i];if(dfs(b,m))return1;

b[m-1]=a[i]*a[j];if(dfs(b,m))return1;

if(a[j]!=0)b[m-1]=a[i]/a[j];if(dfs(b,m))return1;

if(a[i]!=0)b[m-1]=a[j]/a[i];if(dfs(b,m))return1;

}

}

return0;

}

intmain(){

intn;

inta[10];

cin>>n;

for(inti=0;i<n;++i)cin>>a[i];

if(dfs(a,n))cout<<"YES"<<endl;

elsecout<<"NO"<<endl;

system("pause");

return0;

}

第4题

问答题

ProjectSummer游戏

小I和小B最近沉迷一款叫做《ProjectSummer》的游戏,小I扮演这个游戏中需要逃生的无辜者

(Innocent),小B扮演这个游戏中抓住无辜者,阻止其逃生的背叛者(Betrayer)。

这个游戏的地图是一个N行M列的矩形,每个格点表示一个位置。

'#'表示地图中的障碍物,'.'表示地图中的空地,此外,地图中还有只有背叛者才能使用的传送门,用小写

字母'a'-'z'标记,它们在地图上成对出现。

角色可以花费1单位的时间从一个格子走到上下左右相邻的4个空地中的另一个格子(不可以走出地图边界或

者走到障碍物上)。此外,当小B扮演的背叛者走到一个传送门上时,他可以花费1单位的时间从当前格子

传送到与当前格子相同字母的另一个传送门处(他也可以选择不传送,此时没有花费任何时间,待在原地不

动)。

传送是双向的。比如,现在小B走到了标记为'a'的格子上,那么他可以选择花费一单位的时间传送到另一

个标记为'a'的格子上,也可以选择不传送,那么他就待在原地不动。

现在,小I被小B的陷阱困住了,无法移动。给出地图上小B和小I所在的格子(他们都站在空地上),

求小B最少需要花费多少时间才能走到小I所在的格子抓住他。如果小I无法抓住小B,输出-1

时间限制:1000

内存限制:65536

输入

第一行一个数字T,表示数据组数。接下来描述T组数据,每组数据最开始是两个正整数N,M表示地图是

N行M列的矩形。接下来N行,每行M个字符,表示地图。在地图上,用'.'表示空地,'#'表示障碍

物,'a'-'z'表示传送门,'B'表示小B的初始位置,'I'表示小I的初始位置。对于每组数据,保证在地图上

标记相同的传送

门恰好出现两次。T,N,M<=100

输出

T行,第i行输出'Case#i:t',表示第i组数据的答案是t.小B最少需要t单位时间才能走到小I所在的格

子。如果小I无法抓住小B,输出-1

样例输入

3

55

Bx#..

#a.#.

.....

##..#

.x.aI

55

BIa.a

x#.x.

.#.##

.....

#####

22

B#

#I

样例输出

Case#1:4

Case#2:1

Case#3:-1

提示

对于第一组数据,假设行从上到下标号1到5,列从左到右标号1到5,小B初始在(1,1)。小B的最优

路线是:(1,1)->(1,2)->(2,2)->(5,4)->(5,5)

。也就是走到标记为x的传送门时忽略传送门,走到标

记为a的传送门时使用传送门。对于第二组数据,小B直接花费1单位时间向右走一格就可以抓住小I,故

输出1。对于第三组数据,小B无法走到小I所在的位置上,故输出-1。

答案

#include<iostream>

#include<cstring>

#include<queue>

usingnamespacestd;

intT,N,M;

int

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论