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; } 第八题:四平方和 暴力枚举4(3个也可以)个数,控制条件 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) {