1. 程式人生 > >第七屆藍橋杯省賽C/C++B組賽題及答案

第七屆藍橋杯省賽C/C++B組賽題及答案

part 實現 void 整數 三層 在一起 idt mage 算法;

第一題

【題目】

煤球數目

有一堆煤球,堆成三角棱錐形。具體:
第一層放1個,
第二層3個(排列成三角形),
第三層6個(排列成三角形),
第四層10個(排列成三角形),
....
如果一共有100層,共有多少個煤球?

請填表示煤球總數目的數字。
註意:你提交的應該是一個整數,不要填寫任何多余的內容或說明性文字。

【提示】

找出每一層煤球個數的規律,循環累加計算

【答案】

 1 #include<stdio.h>
 2 int main()
 3 {
 4     int i,s=1,num=1;
 5     for(i=2;i<=100;i++)
 6     {
 7         s+=i;
8 num+=s; 9 } 10 printf("%d",num); 11 getchar(); 12 return 0; 13 }

第二題

【題目】

生日蠟燭

某君從某年開始每年都舉辦一次生日party,並且每次都要吹熄與年齡相同根數的蠟燭。

現在算起來,他一共吹熄了236根蠟燭。

請問,他從多少歲開始過生日party的?

請填寫他開始過生日party的年齡數。
註意:你提交的應該是一個整數,不要填寫任何多余的內容或說明性文字。

【提示】

可以看做中間n項的等差數列求和,已知公差為1,Sn=236,求a1,Sn=n*a1+n*(n-1)/2,雙層循環,輸出符合的n和a1

(題目只要a1

【答案】

 1 #include<stdio.h>
 2 int main()
 3 {
 4     int i,j;
 5     for(i=1;i<120;i++)
 6     for(j=2;j<120-i;j++)
 7     if((i*j+j*(j-1)/2.0)==236) printf("%d",i);
 8     getchar();
 9     return 0;
10 } 

第三題

【題目】

湊算式

技術分享圖片
這個算式中A~I代表1~9的數字,不同的字母代表不同的數字。

比如:
6+8/3+952/714 就是一種解法,
5+3/1+972/486 是另一種解法。

這個算式一共有多少種解法?

註意:你提交應該是個整數,不要填寫任何多余的內容或說明性文字。

【提示】

方法一:用九層循環遍歷所有可能,判斷滿足條件的組合;

方法二:回溯法,排列樹遍歷,可加入剪枝算法;

【答案】

 1 #include <stdio.h>
 2 void swap(int &a,int &b)
 3 {
 4     int t;
 5     t=a;
 6     a=b;
 7     b=t;
 8 }
 9 void output(int*x,int &count){
10     if((x[0]+x[1]*1.0/x[2]+((x[3]*100+x[4]*10+x[5])*1.0/(x[6]*100+x[7]*10+x[8])))==10.0){
11         count++;
12         printf("%d+%d/%d+%d%d%d/%d%d%d\n",x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8]);
13     }
14     
15 }
16 void Backtrack(int t,int *x,int &count)
17 {
18     if(t>=9)
19         output(x,count);
20     else
21         for(int i=t;i<9;i++){
22             swap(x[t],x[i]);
23             Backtrack(t+1,x,count);
24             swap(x[t],x[i]);
25         }
26 }
27 int main()
28 {
29     int x[]={1,2,3,4,5,6,7,8,9},count=0;
30     Backtrack(0,x,count);
31     printf("%d",count);
32     return 0;
33 }

第四題

【題目】

快速排序

排序在各種場合經常被用到。
快速排序是十分常用的高效率的算法。

其思想是:先選一個“標尺”,
用它把整個隊列過一遍篩子,
以保證:其左邊的元素都不大於它,其右邊的元素都不小於它。

這樣,排序問題就被分割為兩個子區間。
再分別對子區間排序就可以了。

下面的代碼是一種實現,請分析並填寫劃線部分缺少的代碼。


#include <stdio.h>

void swap(int a[], int i, int j)
{
int t = a[i];
a[i] = a[j];
a[j] = t;
}

int partition(int a[], int p, int r)
{
int i = p;
int j = r + 1;
int x = a[p];
while(1){
while(i<r && a[++i]<x);
while(a[--j]>x);
if(i>=j) break;
swap(a,i,j);
}
______________________;
return j;
}

void quicksort(int a[], int p, int r)
{
if(p<r){
int q = partition(a,p,r);
quicksort(a,p,q-1);
quicksort(a,q+1,r);
}
}

int main()
{
int i;
int a[] = {5,13,6,24,2,8,19,27,6,12,1,17};
int N = 12;

quicksort(a, 0, N-1);

for(i=0; i<N; i++) printf("%d ", a[i]);
printf("\n");

return 0;
}


註意:只填寫缺少的內容,不要書寫任何題面已有代碼或說明性文字。

【提示】

理解各個函數作用即可

【答案】

 1 #include <stdio.h>
 2 
 3 void swap(int a[], int i, int j)
 4 {
 5     int t = a[i];
 6     a[i] = a[j];
 7     a[j] = t;
 8 }
 9 
10 int partition(int a[], int p, int r)
11 {
12     int i = p;
13     int j = r + 1;
14     int x = a[p];
15     while(1){
16         while(i<r && a[++i]<x);
17         while(a[--j]>x);
18         if(i>=j) break;
19         swap(a,i,j);
20     }
21     swap(a,p,j);
22     return j;
23 }
24 
25 void quicksort(int a[], int p, int r)
26 {
27     if(p<r){
28         int q = partition(a,p,r);
29         quicksort(a,p,q-1);
30         quicksort(a,q+1,r);
31     }
32 }
33     
34 int main()
35 {
36     int i;
37     int a[] = {5,13,6,24,2,8,19,27,6,12,1,17};
38     int N = 12;
39     
40     quicksort(a, 0, N-1);
41     
42     for(i=0; i<N; i++) printf("%d ", a[i]);
43     printf("\n");
44     
45     return 0;
46 }

第五題

【題目】

抽簽

X星球要派出一個5人組成的觀察團前往W星。
其中:
A國最多可以派出4人。
B國最多可以派出2人。
C國最多可以派出2人。
....

那麽最終派往W星的觀察團會有多少種國別的不同組合呢?

下面的程序解決了這個問題。
數組a[] 中既是每個國家可以派出的最多的名額。
程序執行結果為:
DEFFF
CEFFF
CDFFF
CDEFF
CCFFF
CCEFF
CCDFF
CCDEF
BEFFF
BDFFF
BDEFF
BCFFF
BCEFF
BCDFF
BCDEF
....
(以下省略,總共101行)


#include <stdio.h>
#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<i; j++) b[M-m+j] = k+‘A‘;
______________________; //填空位置
}
}
int main()
{
int a[N] = {4,2,2,1,1,3};
char b[BUF];
f(a,0,M,b);
return 0;
}

仔細閱讀代碼,填寫劃線部分缺少的內容。

註意:不要填寫任何已有內容或說明性文字。

【提示】

理解各個函數作用即可

【答案】

 1 #include <stdio.h>
 2 #define N 6
 3 #define M 5
 4 #define BUF 1024
 5 
 6 void f(int a[], int k, int m, char b[])
 7 {
 8     int i,j;
 9     
10     if(k==N){ 
11         b[M] = 0;
12         if(m==0) printf("%s\n",b);
13         return;
14     }
15     
16     for(i=0; i<=a[k]; i++){
17         for(j=0; j<i; j++) b[M-m+j] = k+A;
18         f(a,k+1,m-i,b);  //填空位置
19     }
20 }
21 int main()
22 {    
23     int  a[N] = {4,2,2,1,1,3};
24     char b[BUF];
25     f(a,0,M,b);
26     return 0;
27 }

第六題

【題目】

方格填數

如下的10個格子
技術分享圖片

填入0~9的數字。要求:連續的兩個數字不能相鄰。
(左右、上下、對角都算相鄰)

一共有多少種可能的填數方案?

請填寫表示方案數目的整數。
註意:你提交的應該是一個整數,不要填寫任何多余的內容或說明性文字。

【提示】

把方格看做大小為10的數組,排列樹0~9,統計滿足關系的特殊排列

【答案】

 1 #include <stdio.h>
 2 #include <stdlib.h> 
 3 void swap(int &a,int &b)
 4 {
 5     int t;
 6     t=a;
 7     a=b;
 8     b=t;
 9 }
10 void output(int *x,int &count){
11     if(
12         (abs(x[0]-x[1])!=1&&abs(x[0]-x[3])!=1&&abs(x[0]-x[4])!=1&&abs(x[0]-x[5])!=1)&&
13         (abs(x[1]-x[2])!=1&&abs(x[1]-x[4])!=1&&abs(x[1]-x[5])!=1&&abs(x[1]-x[6])!=1)&&
14         (abs(x[2]-x[5])!=1&&abs(x[2]-x[6])!=1)&&
15         (abs(x[3]-x[4])!=1&&abs(x[3]-x[7])!=1&&abs(x[3]-x[8])!=1)&&
16         (abs(x[4]-x[5])!=1&&abs(x[4]-x[7])!=1&&abs(x[4]-x[8])!=1&&abs(x[4]-x[9])!=1)&&
17         (abs(x[5]-x[6])!=1&&abs(x[5]-x[8])!=1&&abs(x[5]-x[9])!=1)&&
18         (abs(x[6]-x[9])!=1)&&
19         (abs(x[7]-x[8])!=1)&&
20         (abs(x[8]-x[9])!=1)
21       )
22         count++;    
23     
24 }
25 void Backtrack(int t,int *x,int &count)
26 {
27     if(t>=10)
28         output(x,count);
29     else
30         for(int i=t;i<10;i++){
31             swap(x[t],x[i]);
32             Backtrack(t+1,x,count);
33             swap(x[t],x[i]);
34         }
35 }
36 int main()
37 {
38     int x[]={0,1,2,3,4,5,6,7,8,9},count=0;
39     Backtrack(0,x,count);
40     printf("%d",count);
41     return 0;
42 }

第七題

【題目】

剪郵票

技術分享圖片, 有12張連在一起的12生肖的郵票。
現在你要從中剪下5張來,要求必須是連著的。
(僅僅連接一個角不算相連)
比如,技術分享圖片技術分享圖片中,粉紅色所示部分就是合格的剪取。

請你計算,一共有多少種不同的剪取方法。

請填寫表示方案數目的整數。
註意:你提交的應該是一個整數,不要填寫任何多余的內容或說明性文字。

【提示】

【答案】

第八題

【題目】

【提示】

【答案】

第七屆藍橋杯省賽C/C++B組賽題及答案