hello
我是「 YR_T 」
今天继续来发蓝桥杯真题,这个专栏也已经更新到第三篇了,我目标就是刷爆249道蓝桥杯真题
这么算算我还能发50多篇呢。。。
也祝各位都能拿到省一
废话不多说,直接开始做题!
目录
第一题 「生日蜡烛」2016初赛
分析
代码
第二题 「方格填数」2016初赛
分析
代码
第三题 「寒假作业」2016初赛
分析
第一种代码
第二种代码
第四题 「剪邮票」2016初赛
分析
代码
最后
题目描述:
某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。
现在算起来,他一共吹熄了236根蜡烛。
请问,他从多少岁开始过生日party的?
请填写他开始过生日party的年龄数。 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
这道题很简单,看注释就能看懂
#include
#include
using namespace std;
int main()
{
int i;
for(i=1;i<236;i++)
{
int n = i,sum = 0;//n是记录从多大开始过生日的,sum记录共吹灭的蜡烛数
int t = n;//保存一开始过生日时候的岁数
while(true)
{
sum+=n;//记录总共吹灭的蜡烛
n++;
if(sum==236)
{
cout<236)
break;
}
}
return 0;
}
题目描述
如下的10个格子,填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)一共有多少种可能的填数方案?
输出格式
请填写表示方案数目的整数。
先给方格按顺序排个号,再用 next_permutation 函数全排列,然后把所有相邻差值为1的条件判断一遍。通俗讲就是暴力
#include
#include
using namespace std;
int a[11]={0,1,2,3,4,5,6,7,8,9};
int judge()
{
if(abs(a[0]-a[1])==1||abs(a[0]-a[3])==1||abs(a[0]-a[4])==1||abs(a[0]-a[5])==1)
return 0;
else if(abs(a[1]-a[2])==1||abs(a[1]-a[4])==1||abs(a[1]-a[5])==1||abs(a[1]-a[6])==1)
return 0;
else if(abs(a[2]-a[5])==1||abs(a[2]-a[6])==1)
return 0;
else if(abs(a[3]-a[4])==1||abs(a[3]-a[7])==1||abs(a[3]-a[8])==1)
return 0;
else if(abs(a[4]-a[5])==1||abs(a[4]-a[7])==1||abs(a[4]-a[8])==1||abs(a[4]-a[9])==1)
return 0;
else if(abs(a[5]-a[6])==1||abs(a[5]-a[8])==1||abs(a[5]-a[9])==1)
return 0;
else if(abs(a[6]-a[9])==1)
return 0;
else if(abs(a[7]-a[8])==1)
return 0;
else if(abs(a[8]-a[9])==1)
return 0;
return 1;
}
int main()
{
int c=0;
do
{
if(judge())
c++;
}while(next_permutation(a,a+10));
printf("%d\n",c);
return 0;
}
题目描述
现在小学的数学题目也不是那么好玩的。
看看这个寒假作业:
每个方块代表1~13中的某一个数字,但不能重复。
比如:
6 + 7 = 13
9 - 8 = 1
3 * 4 = 12
10 / 2 = 5
以及:
7 + 6 = 13
9 - 8 = 1
3 * 4 = 12
10 / 2 = 5
就算两种解法。(加法,乘法交换律后算不同的方案)
你一共找到了多少种方案?
输出格式
请填写表示方案数目的整数。
这道题目是从13个数中选12个填到方框里面,是一个全排列问题。最终13个数都会填完
第一段代码,虽然能够运行出结果,但是花费时间需要将近1分钟,做填空题可以用。能运行出答案就行。
#include
using namespace std;
int a[]={1,2,3,4,5,6,7,8,9,10,11,12,13};
int ans;
bool check(){
if(a[0]+a[1]==a[2]&&
a[3]-a[4]==a[5]&&
a[6]*a[7]==a[8]&&
a[9]%a[10]==0&&
a[9]/a[10]==a[11])
return true;
return false;
}
int f(int k){
if(k==13){ //当数字为13的时候,可以不同return,因为后面for循环它通不过
if(check())
ans++;
}
for(int i=k;i<13;i++){
{
int t=a[i];
a[i]=a[k];
a[k]=t;
}
continue;
f(k+1);
{
int t=a[i]; //回溯,返回原来状态
a[i]=a[k];
a[k]=t;
}
}
int main(){
f(0);
cout<
{int t=a[i];a[i]=a[k];a[k]=t;};
这一行确定了k的位置
#include
using namespace std;
int a[]={1,2,3,4,5,6,7,8,9,10,11,12,13};
int ans;
bool check(){
if(a[0]+a[1]==a[2]&&
a[3]-a[4]==a[5]&&
a[6]*a[7]==a[8]&&
a[9]%a[10]==0&&
a[9]/a[10]==a[11])
return true;
return false;
}
int f(int k){
if(k==13){ //当数字为13的时候,可以不同return,因为后面for循环它通不过
if(check())
ans++;
}
for(int i=k;i<13;i++){
{int t=a[i];a[i]=a[k];a[k]=t;}
//提前检知,节省运行时间
if((k==2&&a[0]+a[1]!=a[2])||k==5&&a[3]-a[4]!=a[5]){ //判断符合条件,再进行递归,不符合直接退出
{int t=a[i];a[i]=a[k];a[k]=t;}
continue;
}
f(k+1);
{int t=a[i];a[i]=a[k];a[k]=t;}//回溯,返回原来状态
}
}
int main(){
f(0);
cout<
题目描述
如下图, 有12张连在一起的12生肖的邮票。现在你要从中剪下5张来,要求必须是连着的。(仅仅连接一个角不算相连)
比如,下面两张图中,粉红色所示部分就是合格的剪取。
请你计算,一共有多少种不同的剪取方法。
输出格式
请填写表示方案数目的整数。
这样用搜索搜不出来,可以先找出小邮票,如果能拼成一个大的邮票,则答案加1。
#include
#include
using namespace std;
int g[3][4],cnt,ans,num[5],vis[3][4];
const int dir[4][2]= {{1,0},{-1,0},{0,1},{0,-1}};
void dfs(int x,int y) {
vis[x][y]=1;//确保不会被重复搜索
cnt++;//cnt=5了就代表5个小邮票可以连成一片
for(int i=0; i<4; i++) {
int dx=x+dir[i][0];
int dy=y+dir[i][1];
if(dx<3 && dy<4 && dx>=0 && dy>=0 && vis[dx][dy]==0 &&g[dx][dy]==1) {
dfs(dx,dy);
}
}
}
void solve(int step,int k) {
if(step == 5) {//凑够5个数了就把他存到图
int x,y;
for(int i=0; i<5; i++) {
x=(num[i]-1)/4;
y=(num[i]-1)%4;
g[x][y]=1;
}
dfs((num[0]-1)/4,(num[0]-1)%4);
if(cnt==5) {
ans++;
}
cnt=0;//用完置为0,不然数据就错了
memset(g,0,sizeof(g));
memset(vis,0,sizeof(vis));
return;
}
for(int i=k+1; i<=12; i++) {//生成一个5个数序列,其实用next_permutation函数也行
num[step]=i;
solve(step+1,i);
}
}
int main() {
solve(0,0);
cout<
最后还是祝各位有个好成绩,这是刷爆题目的第三天,加油吧