2012年蓝桥杯B组初赛(第三届)

1.两种生物

2.填数字(暴力)

答案:21978

3.海盗喝酒

#include<stdio.h>
int main()
{
    int a,b,c,d;
    for(a=20; a>=4; a--)
        for(b=a-1; b>=3; b--)
            for(c=b-1; c>=2; c--)
                for(d=c-1; d>=1; d--)
                    if(1.0/a+1.0/b+1.0/c+1.0/d==1.0)
                        printf("%d,%d,%d,%d,0\n",a,b,c,d);
    return 0;
}

4.电视答题
开一个十层的循环,由于每种情况只有两种选择,所以这种方式是可行的。

#include<stdio.h>
int main()
{
    int mark;
    int a[10];
    for(a[1]=0; a[1]<=1; a[1]++)
        for(a[2]=0; a[2]<=1; a[2]++)
            for(a[3]=0; a[3]<=1; a[3]++)
                for(a[4]=0; a[4]<=1; a[4]++)
                    for(a[5]=0; a[5]<=1; a[5]++)
                        for(a[6]=0; a[6]<=1; a[6]++)
                            for(a[7]=0; a[7]<=1; a[7]++)
                                for(a[8]=0; a[8]<=1; a[8]++)
                                    for(a[9]=0; a[9]<=1; a[9]++)
                                        for(a[10]=0; a[10]<=1; a[10]++)
                                        {
                                            mark=10;
                                            for(int i=1; i<=10; i++)
                                            {
                                                if(a[i]==0)
                                                    mark-=i;
                                                else
                                                    mark*=2;
                                            }
                                            if(mark==100)
                                            {
                                                for(int i=1; i<=10; i++)
                                                    printf("%d",a[i]);
                                                printf("\n");
                                            }
                                        }
    return 0;
}

第五题:矩阵的转置
实现把矩阵顺时针旋转

答案:
rank*rank*sizeof(int );
rank*(i%rank+1)-i/rank-1;(不太会)

第六题:分块乘法题

第一空,看懂题目的图片就可以写出来:

n3/base+n2/base+n1%base;

第二空,处理进制的问题

r[2]/base;

第七题:填旗子
第一空,简单的判断

if(NumRow!=3||NumCol!=3)

第二空,递归

f(x,r,c+1)

第三空,

x[r][c];

第八题:银行密码(模拟题目)
简单的模拟题

#include<iostream>
#include<string.h>
#define maxn 110
using namespace std;
char a[maxn];
char b[20][6];

int change(int x){
    while(x>9){
        int temp=x;
        int sum=0;
        while(temp>0){
            sum+=temp%10;
            temp/=10;
        }
        x=sum;
    }
    return x;
}
int main(){
    int n;

    cin>>n;
    while(n--){
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        scanf("%s",a);
        int l=strlen(a),q=0;

        for(int i=0;i<l;i+=6){
            b[q++][0]=a[i]-'a'+97;
            if(a[i+1]=='\n')
                break;
            else
                b[q-1][1]=a[i+1]-'a'+97;
            if(a[i+2]=='\n')
                break;
            else
                b[q-1][2]=a[i+2]-'a'+97;
            if(a[i+3]=='\n')
                break;
            else
                b[q-1][3]=a[i+3]-'a'+97;
            if(a[i+4]=='\n')
                break;
            else
                b[q-1][4]=a[i+4]-'a'+97;
            if(a[i+5]=='\n')
                break;
            else
                b[q-1][5]=a[i+5]-'a'+97;
        }

    int sum[6];
    memset(sum,0,sizeof(sum));
    for(int i=0;i<6;i++){
        for(int j=0;j<6;j++){
            sum[i]+=b[j][i];
        }
    }
    for(int i=0;i<6;i++){
        if(sum[i]>9){
            sum[i]=change(sum[i]);
        }
    }
    for(int i=0;i<6;i++)
        cout<<sum[i];
    cout<<endl;
    }
    return 0;
}

第九题:足球比赛的胜负

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    double cas[3];
    memset(cas,0,sizeof(cas));
    //甲对乙,甲必须胜
    //丙对丁:丙胜,甲对丙,甲胜+丁胜,甲对丁,甲胜
    cas[0]=0.1*0.2*0.3+0.1*0.8*0.5;
    //甲对丙,甲必须胜
    //乙对丁:乙胜,甲对乙,甲胜+丁胜,甲对丁,甲胜
    cas[1]=0.3*0.4*0.1+0.3*0.6*0.5;
    //甲对丁,甲必须胜
    //乙对丙:乙胜,甲对乙,甲胜+丙胜,甲对丙,甲胜
    cas[2]=0.5*0.7*0.1+0.5*0.3*0.3;
    //下面进行十万次模拟
    int i,t;
    double sum=0.0;
    for(i =0; i<100000; i++)
    {
        t=rand()%3;
        if(t==0)
            sum+=cas[0];
        if(t==1)
            sum+=cas[1];
        if(t==2)
            sum+=cas[2];
    }
    printf("%lf\n",sum/100000);
    return 0;
}

第十题:博弈
这是一道博弈的题目。我自己写的时候写错了,我直接用的dfs,dfs可以用来求解有无可能让a获胜,而题目要求的是两个人足够聪明,会想办法让自己赢。

别人的代码:

#include <string.h>
#include <stdio.h>
int op[4]= {1,3,7,8};//四种操作
int main()
{
    int n,a[10000],m;
    memset(a,0,sizeof(a));//先都初始化为0
    for(int i=1; i<10000; i++)//用i表示球的数量
        for(int j=0; j<4; j++)//四种情况一一判断,一旦发现一个可以使A获胜的取法就可以了。
            if(i-op[j]>0)//首先保证在这种情况下有足够球可取
            {
                if(a[i-op[j]]==0)//A取完,剩下的球让B来取,已经没有胜利的可能(此时可以看做对于i-op[j]个球是B先取,为0表示B只能失败)
                {
                    a[i]=1;//i个球A先取的情况A可以取胜
                    break;
                }
            }
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&m);
        printf("%d\n",a[m]);
    }
    return 0;
}

当时我写错了的:

#include<iostream>
using namespace std;
int n,p;
bool flag=false;
void dfs(int index,int sum){
    if(sum<0) return ;
    if(sum==0){
        if(index%2==0){
            flag=true;
        }
        return ;
    }
    dfs(index+1,sum-1);
    dfs(index+1,sum-3);
    dfs(index+1,sum-7);
    dfs(index+1,sum-8);
}
int main(){
    cin>>n;
    while(n--){
        cin>>p;
        flag=false;
        dfs(0,p);
        if(flag)
            cout<<"1"<<endl;
        else
            cout<<"0"<<endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值