2015年蓝桥杯B组初赛

时间:2021-04-26 11:10:22

1.暴力

#include<iostream>
using namespace std;
int main(){
int ans=0;
for(int i=0;i<=9;i++){
for(int j=0;j<=9;j++){
for(int k=0;k<=9;k++){
for(int p=0;p<=9;p++){
for(int q=1;q<=9;q++){
if(p!=4&&q!=4&&i!=4&&j!=4&&k!=4){
ans++;
}
}
}
}
}
}
cout<<ans<<endl;
return 0;
}
答案是52488

2.日期题目
这道题可以调用excel中的日期函数,可以在excel表格中输入2014/11/9,然后在第二个表格中输入2017/8/5,调用date函数可以实现。
下面编程计算:

//闰年的判断:x%4==0||x%100==0&&x%400!=0
#include<iostream>
using namespace std;

int main(){
int y,m;
int day1[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int day2[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int shengyu=1000-(30-9)-31;
y=2015;
while(shengyu>365){
if(y%4==0||(y%100==0&&y%400!=0)){
shengyu-=366;
}else{
shengyu-=365;
}
y++;
}
//处理是闰年,并且还超过2月
if((y%4==0||(y%100==0&&y%400!=0))&&shengyu>59){
m=1;
while(shengyu>29){
shengyu-=day2[m];
m++;
}
cout<<y<<"-"<<m<<"-"<<shengyu<<endl;
}
//还剩2种情况,不是闰年或者剩余的时间小于59,因此不用考虑2月份的问题
else{
m=1;
//当剩余的天数大于日数最小月份的天数
while(shengyu>28){
shengyu-=day1[m];
m++;
}
cout<<y<<"-";
if(m<10)
cout<<"0"<<m<<"-";
else
cout<<m<<"-";
if(shengyu<10)
cout<<"0"<<shengyu<<endl;
else
cout<<shengyu<<endl;

}
return 0;
}

3.填数问题
法一:next_permutation(a,a+10)

 #include <cstdio>
#include <algorithm>
using namespace std;

int main() {
int a[10];
for (int i = 0; i < 10; i++) a[i] = i;

do {
if (!a[2] || !a[6]) continue;
int x = a[2]*1000 + a[3]*100 + a[4]*10 + a[5];
int y = a[6]*1000 + a[7]*100 + a[8]*10 + a[3];
int z = a[6]*10000 + a[7]*1000 + a[4]*100 + a[3]*10 + a[9];
if (x + y == z) printf("%d + %d = %d\n", x, y, z);
} while (next_permutation(a, a+10));

return 0;
}

法二:暴力

#include<stdio.h>
int main()
{
int a,s,d,f,g,h,j,k;
for(a=1; a<=9; a++)
for(s=0; s<=9; s++)
for(d=0; d<=9; d++)
for(f=1; f<=9; f++)
for(g=0; g<=9; g++)
for(h=0; h<=9; h++)
for(j=0; j<=9; j++)
for(k=0; k<=9; k++)
if((1000*g+100*f+10*h+j+1000*a+100*s+10*d+f==10000*a+1000*s+100*h+10*f+k)&&(a!=s)&&(a!=d)&&(a!=f)&&(a!=g)&&(a!=h)&&(a!=j)&&(a!=k)&&(s!=d)&&(s!=f)&&(s!=g)&&(s!=h)&&(s!=j)&&(s!=k)&&(d!=f)&&(d!=g)&&(d!=h)&&(d!=j)&&(d!=k)&&(f!=g)&&(f!=h)&&(f!=j)&&(f!=k)&&(g!=h)&&(g!=j)&&(g!=k)&&(h!=j)&&(h!=k)&&(j!=k)&&(h!=j)&&(h!=k)&&(j!=k))
printf("%d %d %d %d\n",a,s,d,f);
return 0;
}

第四题:程序填空
第五题:程序填空

dfs的思路

{t=x[k]; x[k]=x[i]; x[i]=t;}

第六题:
暴力

#include<iostream>
using namespace std;
int sum;

int main(){
for(int i=1;i<47;i++){
for(int j=i+2;j<49;j++){
sum=0;
sum+=1225+i*(i+1)+j*(j+1)-(i+i+1+j+j+1);
if(sum==2015){cout<<i<<endl;}
}
}
return 0;
}

第七题:牌型总数

其实13层循环也可以,每层都是i从0-4,如果sum为13,ans++.

#include<iostream>
using namespace std;
int sum=0;
int ans=0;

void dfs(int index)
{
if(sum>13) //大于13,不可行
return ;
if(index==14){
if(sum==13)
ans++;
return ;
}

for(int i=0;i<=4;i++){
sum+=i;
dfs(index+1);
sum-=i;
}
}

int main(){
dfs(1);
cout<<ans<<endl;
return 0;
}

第八题:

#include<iostream>
#include<cmath>
using namespace std;

void getPos(int w,int m,int &x,int &y){
x=(m-1)/w+1;
y=m%w;
if(y==0) { y=w;}
//偶数行需要倒过来数,奇数行正着数
if(x%2==0)
{
y=w-y+1;
}
}
int main(){
int w,m,n;
int x1,y1;
int x2,y2;
cin>>w>>m>>n;

//输入房子的序号,返回房子所在的行和列
getPos(w,m,x1,y1);
getPos(w,n,x2,y2);
int dis=abs(x1-x2)+abs(y1-y2);
cout<<dis<<endl;
return 0;
}