蓝桥杯省赛赛前集训题共题.docx
《蓝桥杯省赛赛前集训题共题.docx》由会员分享,可在线阅读,更多相关《蓝桥杯省赛赛前集训题共题.docx(18页珍藏版)》请在冰豆网上搜索。
![蓝桥杯省赛赛前集训题共题.docx](https://file1.bdocx.com/fileroot1/2023-1/28/21dde5b0-cfb6-49e0-b745-65c15b27053a/21dde5b0-cfb6-49e0-b745-65c15b27053a1.gif)
蓝桥杯省赛赛前集训题共题
SANY标准化小组#QS8QHH-HHGX8Q8-GNHHJ8-HHMHGN#
蓝桥杯省赛赛前集训题共题
第1题:
星系炸弹(2015年省赛C/C++B组第2题)
在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。
每个炸弹都可以设定多少天之后爆炸。
比如:
阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸。
有一个贝塔炸弹,2014年11月9日放置,定时为1000天,请你计算它爆炸的准确日期。
请填写该日期,格式为yyyy-mm-dd即4位年份2位月份2位日期。
比如:
2015-02-19
请严格按照格式书写。
不能出现其它文字或符号。
•结果:
2017-08-05
•解决方法:
用Excel拖
这个题会了的同学们把上课讲过的,课件上的,其他几道Excel拖动题都做一遍。
第2题:
(2015年校内选拔赛C/C++B组第3题)
如果x的x次幂结果为10(参见【图】),你能计算出x的近似值吗
显然,这个值是介于2和3之间的一个数字。
请把x的值计算到小数后6位(四舍五入),并填写这个小数值。
注意:
只填写一个小数,不要写任何多余的符号或说明。
#include
#include
#include
usingnamespacestd;
intmain()
{
doublex;
for(x=2;x<=3;x+=1e-7)
{
if(abs(pow(x,x)-10)<1e-6)
cout<}
return0;
}
答案:
其他类似题:
ALGO-23一元三次方程求解
第3题(全排列)
注意:
全排列必考!
全排列必考!
全排列必考!
重要的事要说三遍!
李白打酒(2014年省赛本科B组第3题)
话说大诗人李白,一生好饮。
幸好他从不开车。
一天,他提着酒壶,从家里出来,酒壶中有酒2斗。
他边走边唱:
无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。
?
请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。
则:
babaabbabbabbbb就是合理的次序。
像这样的答案一共有多少呢请你计算出所有可能方案的个数(包含题目给出的)。
答案:
14
解法1:
next_permutation的解法
#include
#include
usingnamespacestd;
intmain()
{
•intp[15]={1,1,1,1,1,2,2,2,2,2,2,2,2,2,2};
/十六进制转十进制
.
•当排满一行时,从下一行相邻的楼往反方向排号。
•比如:
当小区排号宽度为6时,开始情形如下:
•123456
•121110987
•131415.....
•我们的问题是:
已知了两个楼号m和n,需要求出它们之间的最短移动距离(不能斜线方向移动)
•输入为3个整数wmn,空格分开,都在1到10000范围内
•w为排号宽度,m,n为待计算的楼号。
•要求输出一个整数,表示mn两楼间最短移动距离。
•例如:
•用户输入:
•682
•则,程序应该输出:
•4
•再例如:
•用户输入:
•4720
•则,程序应该输出:
•5
有同学居然说,前面7题做了一个小时。
第8题做了2个小时没做出来。
掌握了求余运算课件里的单变量矩阵坐标转双变量的方法,就很容易了
#include
#include
usingnamespacestd;
intmain()
{
intw,m,n;
•inti,j;所填字母只允许是A,B,C,D,E,F中的某一个。
•2.每行的6个小格中,所填写的字母不能重复。
•3.每列的6个小格中,所填写的字母不能重复。
•4.每个分组(参见图中不同颜色表示)包含的6个小格中,所填写的字母不能重复。
•为了表示上的方便,我们用下面的6阶方阵来表示图[]对应的分组情况(组号为0~5):
•000011
•022013
•221113
•243333
•244455
•445555
•
•用下面的数据表示其已有字母的填写情况:
•02C
•03B
•05A
•20D
•35E
•53F
•很明显,第一列表示行号,第二列表示列号,第三列表示填写的字母。
行号、列号都从0开始计算。
•一种可行的填写方案(此题刚好答案唯一)为:
•EFCBDA
•ACEDFB
•DABECF
•FBDCAE
•BDFAEC
•CEAFBD
•你的任务是:
编写程序,对一般的拉丁方块问题求解,如果多解,要求找到所有解。
•【输入、输出格式要求】
•用户首先输入6行数据,表示拉丁方块的分组情况。
•接着用户输入一个整数n(n<36),表示接下来的数据行数
•接着输入n行数据,每行表示一个预先填写的字母。
•程序则输出所有可能的解(各个解间的顺序不重要)。
•每个解占用7行。
•即,先输出一个整数,表示该解的序号(从1开始),接着输出一个6x6的字母方阵,表示该解。
•解的字母之间用空格分开。
•如果找不到任何满足条件的解,则输出“无解”
•例如:
用户输入:
•000011
•022013
•221113
•243333
•244455
•445555
•6
•02C
•03B
•05A
•20D
•35E
•53F
•则程序输出:
•1
•EFCBDA
•ACEDFB
•DABECF
•FBDCAE
•BDFAEC
•CEAFBD
•再如,用户输入:
•001111
•002113
•022243
•022443
•544433
•555553
•7
•04B
•05A
•13D
•14C
•24E
•50C
•51A
•则程序输出:
•1
•DCEFBA
•EFADCB
•ABFCED
•BEDAFC
•FDCBAE
•CABEDF
•2
•DCEFBA
•EFADCB
•ADFBEC
•BECAFD
•FBDCAE
•CABEDF
•3
•DCFEBA
•AEBDCF
•FDACEB
•BFEADC
•EBCFAD
•CADBFE
•4
•DCFEBA
•BEADCF
•ADCFEB
•FBEADC
•EFBCAD
•CADBFE
•5
•DCFEBA
•EFADCB
•ABCFED
•BEDAFC
•FDBCAE
•CAEBDF
•6
•DCFEBA
•EFADCB
•ABDFEC
•BECAFD
•FDBCAE
•CAEBDF
•7
•DCFEBA
•EFADCB
•ADBFEC
•BECAFD
•FBDCAE
•CAEBDF
•8
•DCFEBA
•FEADCB
•ADBCEF
•BFEADC
•EBCFAD
•CADBFE
•9
•DCFEBA
•FEADCB
•AFCBED
•BDEAFC
•EBDCAF
•CABFDE
#include
usingnamespacestd;
chara[6][6];//存放分组情况
charc[6][6];//存放数独
intcnt;
boolok(introw,intcol)
{
inti,j;
for(i=0;i<6;i++)//检查行
if(c[row][i]==c[row][col]&&i!
=col)returnfalse;
for(i=0;i<6;i++)//检查列
if(c[i][col]==c[row][col]&&i!
=row)returnfalse;
for(i=0;i<6;i++)//检查同一区域
for(j=0;j<6;j++)
if(a[i][j]==a[row][col]&&c[i][j]==c[row][col]&&!
(i==row&&j==col))returnfalse;
returntrue;
}
voidsudoku(intidx)
{
inti,j;
chark;
if(idx==36)
{
cout<<++cnt<for(i=0;i<6;i++)
{
for(j=0;j<6;j++)
{
cout<if(j!
=5)cout<<"";
}
cout<}
return;
}
introw=idx/6;
intcol=idx%6;
if(c[row][col]==0)
{
for(k='A';k<='F';k++)
{
c[row][col]=k;//填字母
if(ok(row,col))
sudoku(idx+1);//如果不冲突,则继续递归填下一个
}
c[row][col]=0;
}
else//遇到预先填好的字母
sudoku(idx+1);
}
intmain()
{
inti,j,n;
strings;
for(i=0;i<6;i++)//确定拉丁方块的分组情况
cin>>a[i];
cin>>n;
while(n--)
{
cin>>s;
intx=s[0]-'0';
inty=s[1]-'0';
c[x][y]=s[2];
}
sudoku(0);
if(cnt==0)cout<<"无解"<return0;
}
第14题(bfs算法)
ADV-147算法提高学霸的迷宫
•问题描述
• 学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗。
但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二维的格子迷宫,要进城堡必须得先通过迷宫。
因为班长还有妹子要陪,磨刀不误砍柴功,他为了节约时间,从线人那里搞到了迷宫的地图,准备提前计算最短的路线。
可是他现在正向妹子解释这件事情,于是就委托你帮他找一条最短的路线。
•输入格式
• 第一行两个整数n,m,为迷宫的长宽。
• 接下来n行,每行m个数,数之间没有间隔,为0或1中的一个。
0表示这个格子可以通过,1表示不可以。
假设你现在已经在迷宫坐标(1,1)的地方,即左上角,迷宫的出口在(n,m)。
每次移动时只能向上下左右4个方向移动到另外一个可以通过的格子里,每次移动算一步。
数据保证(1,1),(n,m)可以通过。
•输出格式
• 第一行一个数为需要的最少步数K。
• 第二行K个字符,每个字符∈{U,D,L,R},分别表示上下左右。
如果有多条长度相同的最短路径,选择在此表示方法下字典序最小的一个。
•样例输入
•InputSample1:
•33
•001
•100
•110
•
•InputSample2:
•33
•000
•000
•000
•样例输出
•OutputSample1:
•4
•RDRD
•
•OutputSample2:
•4
•DDRR
•数据规模和约定
• 有20%的数据满足:
1<=n,m<=10
• 有50%的数据满足:
1<=n,m<=50
• 有100%的数据满足:
1<=n,m<=500。
#include
#include
usingnamespacestd;
#defineM500
#defineN500
//上下左右UDLR,按字典序排是DLRU,即下左右上,所以d数组调整了一下
constintd[][2]=
{
1,0,
0,-1,
0,1,
-1,0,
};
boolmaze[M][N];//位置点的状态,0表示通道,1表示墙
boolvisited[M][N];//标志着该点是否被访问到了
intm,n;//迷宫的实际行数和列数
structPoint//结构体,表示位置点
{
intx,y;//位置点的横纵坐标
};
Pointpre[M][N];//记录了到达本点前一步的那个点的坐标
intstep;
strings="";
voidprint_path(Pointp)//递归打印路径
{
if==0&&==0)
{
return;
}
Pointq=pre[][];
print_path(q);
step++;
if>s+='D';
elseif
elseif>s+='R';
elses+='L';
}
voidbfs()//广度优先算法bfs
{
queueQ;//定义队列Q
Pointp={0,0};
visited[0][0]=true;//入口点被访问
(p);///入口点入队
while(!
())//当队列不为空时
{
Pointhead=();//读队首元素
();//队首元素出队
intx=;
inty=;
if(x==m-1&&y==n-1)//到达终点
{
print_path(head);//打印
return;//到达终点,停止bfs()
}
for(inti=0;i<4;i++)
{
intr=x+d[i][0];
intc=y+d[i][1];
if(r>=0&&r=0&&c{
visited[r][c]=true;//标记为已访问
pre[r][c]=head;//记录前一步
Pointp={r,c};
(p);//入队
}
}
}
}
intmain()
{
cin>>m>>n;
for(inti=0;i{
for(intj=0;j{
charc;
cin>>c;
maze[i][j]=c-'0';
}
}
bfs();
cout<cout<
return0;
}