2015年蓝桥杯B组初赛(第六届)

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值