2016第七届蓝桥杯省赛c/c++本科B组试题总结及解题答案

2016第七届蓝桥杯c/c++本科B组试题总结及解题答案

第一题:煤球数目

i层的煤球数组为(1+n)*n/2,答案:171700

第二题:生日蜡烛

思路:1 2 3 4 5 6……这一个等差数列的前n项和为(1+n)*n/2

设从a岁开始过生日,到了b岁一共吹熄了236根蜡烛。

即为:(a+b)(b-a+1)/2=236,答案:26

for(int i=1;i<=100;i++)  

     for(int j=i;j<=100;j++)  

          if((i+j)*(j-i+1)/2==236)  

         cout<

第三题:凑算式

思路:暴力解决,注意每个字母代表的数字不相等。答案:29

int sum=0;  

    for(int a=1; a<=9; a++)  

        for(int b=1; b<=9; b++)         

            if(a==b) continue;  

            for(int c=1; c<=9; c++)   

                if(c==a||c==b) continue;  

                for(int d=1; d<=9; d++)   

                    if(d==a||d==b||d==c)continue;  

                    for(int e=1; e<=9; e++)   

                        if(e==a||e==b||e==c||e==d) continue;  

                        for(int f=1; f<=9; f++)   

                            if(f==a||f==b||f==c||f==d||f==e) continue;  

                            for(int g=1; g<=9; g++)      

                                if(g==a||g==b||g==c||g==d||g==e||g==f) continue;  

                                for(int h=1; h<=9; h++)    

                                    if(h==a||h==b||h==c||h==d||h==e||h==f||h==g) continue;  

                                    for(int i=1; i<=9; i++)     

                                        if(i==a||i==b||i==c||i==d||i==e||i==f||i==g||i==h) continue;  

                                        int t1=a*c*(100*g+10*h+i);    int t2=b*(100*g+10*h+i);  

                                        int t3=c*(100*d+10*e+f);    int t4=10*c*(100*g+10*h+i);  

                                        if(t1+t2+t3==t4)  

                                            sum++;  

cout<

第四题:快速排序

答案:swap(a,p,j)

 

第五题:抽签

#define N 6  #define M 5  #define BUF 1024  

void f(int a[], int k, int m, char b[])  {  

    int i,j;  

    if(k==N){   

        b[M] = 0;  

        if(m==0) printf("%s\n",b);  

        return;  

    }  

for(i=0; i<=a[k]; i++){  

        for(j=0; j

        _____________;  //填空位置  

    }  

}  

int main()  {     

    int  a[N] = {4,2,2,1,1,3};      char b[BUF];  

    f(a,0,M,b);  

    return 0;  

}  

答案:f(a,k+1,m-i,b)

第六题:方格填数

int dir[8][2]={1, 0, 0, 1, -1, 0, 0, -1, 1, 1, 1, -1, -1, 1, -1, -1}, a[4][4], flag[10], ans=0;

void dfs(int cur){

    if(cur==11){

        for(int i=0;i<4;i++)

            for(int j=0;j<4;j++)

                for(int k=0;k<8;k++){

                    int x=i+dir[k][0];      int y=j+dir[k][1];

                    if(x>=0 && y>=0 && x<4 && y<4)

                        if(a[i][j]==a[x][y]+1)

                            return ;

                }

        ans++;        return ;

    }

    int x=cur/4;    int y=cur%4;

    for(int i=0;i<10;i++){

        if(!flag[i]){

            flag[i]=1;            a[x][y]=i;

            dfs(cur+1);

            flag[i]=0;            a[x][y]=inf;

        }

    }

}

int main(){

    memset(a, inf, sizeof(a));

    memset(flag, 0, sizeof(flag));

    dfs(1);

    printf("%d\n", ans);

    return 0;

}

第七题:剪邮票

思路:先找到5个数的组合,然后从第一个数字开始遍历,经过上下左右操作检测5个数是否都被访问一遍,如果5个数都可以遍历到则种类+1

在原图中向上为-4,向下为+4,向左为-1,向右为+1,但是遇到3 4 5 7 8这种4+1=5但是这种情况不符合,所以重构一下原图:

  这样,向上为-5,向下为+5,向左为-1,向右为+1,避免了每行最后一个+1后等于下一行第一个的情况。

答案:116

int mp[12]= {1,2,3,4,6,7,8,9,11,12,13,14};  int aa[5],vis[5],sum=0;  int b[4]= {-1,1,-5,+5};  

void dfs(int n) {  

    for(int i=0; i<4; i++)    {  

        int t=aa[n]+b[i];  

        if(t<1||t>14||t==5||t==10) continue;  

        for(int j=0; j<5; j++)  

            if(!vis[j]&&aa[j]==t)  {  

                vis[j]=1;   dfs(j);  

            }  

    }  

}  

int main()  {  

    for(int a=0; a<12; a++)  

        for(int b=a+1; b<12; b++)  

            for(int c=b+1; c<12; c++)  

                for(int d=c+1; d<12; d++)  

                    for(int e=d+1; e<12; e++)  {  

                        aa[0]=mp[a];    aa[1]=mp[b];   aa[2]=mp[c];  aa[3]=mp[d];       aa[4]=mp[e];  

                        for(int i=0; i<5; i++)  vis[i]=0;  

                        vis[0]=1;     dfs(0);   int flag=1;;  

                        for(int i=0; i<5; i++)  

                            if(vis[i]!=1)  {          flag=0;  break;         }  

                        if(flag==0) continue;  

                        else     sum++;  

                    }  

    cout<

    return 0;  

}  

 

第八题:四平方和

暴力枚举43个也可以)个数,控制条件

cin>>n;

for(int a=0;a<=2237;a++)  {  

         if(a*a>n) continue;  

         for(int b=a;b<=2237;b++)  {  

             if(a*a+b*b>n) break;  

             for(int c=b;c<=2237;c++)  {  

          if(a*a+b*b+c*c>n) break;  

                     for(int d=c;d<=2237;d++)  {  

                         if(a*a+b*b+c*c+d*d>n) break;  

                         if(a*a+b*b+c*c+d*d==n)  {  

                          cout<

                           return 0;  

                         }  

                     }  

             }  

         }  

     }         

第九题:交换瓶子

(一):选择排序:

    int n,a[10000], minn, sum=0;    cin>>n;  

    for(int i=0; i

         cin>>a[i];   

    for(int i=0; i

         minn=i;  

         for(int j=i+1; j

         if(a[minn]>a[j]) 

                 minn=j;  

         if(minn!=i) {    sum++;         int t=a[i];              a[i]=a[minn];              a[minn]=t;   }  

    }  

cout<

(二):闭包:

int pos[10010], n, ans=0;  

inline void swap(int a,int b)  {     int t = pos[a];      pos[a] = pos[b];      pos[b] = t;  }  

    scanf("%d",&n);  

    for(int i = 1;i<=n;i++)  

        scanf("%d",pos+i);  

    for(int i=1;i<=n;i++)  

        while(pos[i] != i)    {  

            swap(i,pos[i]);  

            ans ++ ;  

        }  

    printf("%d\n",ans);   

你可能感兴趣的:(***ACM***蓝桥***)