有12个乒乓球,当中有一个不合规格,但不知是轻是重。要求用天平称三次,把这个坏球找出来。
大一寒假看到的题目,近期翻出了曾经编的代码,当时还在用goto呢.....
/* 有12个乒乓球,当中有一个不合规格,但不知是轻是重。要求用天平称三次,把这个坏球找出来。 */ #include<iostream.h> #include<conio.h> #include<iomanip.h> #include<stdlib.h> #include<time.h> #include<cstdlib> int check(int a[12],int i) { int n; if(a[i]!=2) { return 0; } else { return 1; } } void main() { int a[12]={2},b[12],sum1=0,sum2=0; srand((unsigned int) time(0)); for(int i=0;i<12;i++) { a[i]=2; } int n=0; Loop: //随机使12个乒乓球中的一个变轻或变重 i=rand()%12; //在12个乒乓球中抽取 a[i]=rand()%3+1; //使2变成1或2或3 //检验乒乓球是否变轻或变重 n=check(a,i); if(n==1) { n=0; goto Loop; //若乒乓球重量不变则又一次变轻或变重 } for(i=0;i<12;i++) { cout<<a[i]; b[i]=a[i]; } //第一次用天平称量 for(i=0;i<8;i++) { if(i<4) { sum1+=a[i]; } else { sum2+=a[i]; } } if(sum1!=sum2) { //第一分支点 int c[3]; for(i=0;i<3;i++) { c[i]=a[i]; //将第一个天秤的前三个球拿走 a[i]=a[i+4]; //将第二个天秤的前三个球放到第一个天秤里 a[i+4]=2; //将已经识别出的四个好球取出三个放在第二个天秤里 } int sum3=0,sum4=0; for(i=0;i<8;i++)//用于检測轻重 { if(i<4) { sum3+=a[i]; } else { sum4+=a[i]; } } //第一分支点 第二次用天平称量 if(sum3!=sum4) { //第一分支点 第①分支点 //观察平衡状态有无改变 if((sum1>sum2&&sum3>sum4)||(sum1<sum2&&sum3<sum4)) //平衡状态没有改变说明坏球在天秤里没有动的两个球中 { //第一分支点 第①分支点 a 第三次用天秤称量 if(a[3]==2) { i=7; cout<<"第"<<i+1<<"个球是坏球"<<" 重量为"<<b[i]<<endl; exit(0); } if(a[7]==2) { i=3; cout<<"第"<<i+1<<"个球是坏球"<<" 重量为"<<b[i]<<endl; exit(0); } } else //平衡状态改变说明坏球在天秤里移动的三个球内 { if(sum3<sum4) { if(a[0]==a[1]) { i=6; cout<<"第"<<i+1<<"个球是坏球"<<" 重量为"<<b[i]<<endl; exit(0); } if(a[0]>a[1]) { i=5; cout<<"第"<<i+1<<"个球是坏球"<<" 重量为"<<b[i]<<endl; exit(0); } if(a[0]<a[1]) { i=4; cout<<"第"<<i+1<<"个球是坏球"<<" 重量为"<<b[i]<<endl; exit(0); } } if(sum3>sum4) { if(a[0]==a[1]) { i=6; cout<<"第"<<i+1<<"个球是坏球"<<" 重量为"<<b[i]<<endl; exit(0); } if(a[0]>a[1]) { i=4; cout<<"第"<<i+1<<"个球是坏球"<<" 重量为"<<b[i]<<endl; exit(0); } if(a[0]<a[1]) { i=5; cout<<"第"<<i+1<<"个球是坏球"<<" 重量为"<<b[i]<<endl; exit(0); } } } } else { //第一分支点 第②分支点 int weight; //说明拿走的三个球中有一个是坏球 if(sum1>sum2)//说明坏球是重球 { weight=1; } if(sum1<sum2)//说明坏球是轻球 { weight=0; } //第一分支点 第②分支点 第三次用天平称量 if(c[0]==c[1]) { i=2; cout<<"第"<<i+1<<"个球是坏球"<<" 重量为"<<c[i]<<endl; exit(0); } if(c[0]>c[1]) { if(weight==1) { i=0; cout<<"第"<<i+1<<"个球是坏球"<<" 重量为"<<c[i]<<endl; exit(0); } else { i=1; cout<<"第"<<i+1<<"个球是坏球"<<" 重量为"<<c[i]<<endl; exit(0); } } else { if(weight==1) { i=1; cout<<"第"<<i+1<<"个球是坏球"<<" 重量为"<<c[i]<<endl; exit(0); } else { i=0; cout<<"第"<<i+1<<"个球是坏球"<<" 重量为"<<c[i]<<endl; exit(0); } } } } else { //第二分支点 sum1=0; sum2=0;//第二分支点 第二次用天平称量 重量相等 for(i=8;i<12;i++) { if(i<10) { sum1+=a[i]; } else { sum2+=a[i]; } } if(sum1==4) { //第二分支点 第①分支点 第三次用天平称量 if(a[10]==2)//将当中一个球与前面已识别出的一个好球比較 { i=11; cout<<"第"<<i+1<<"个球是坏球"<<" 重量为"<<b[i]<<endl; exit(0); } else if(a[11]==2) { i=10; cout<<"第"<<i+1<<"个球是坏球"<<" 重量为"<<b[i]<<endl; exit(0); } } else { //第二分支点 第②分支点 第三次用天平称量 if(a[8]==2)//将当中一个球与前面已识别出的一个好球比較 { i=9; cout<<"第"<<i+1<<"个球是坏球"<<" 重量为"<<b[i]<<endl; exit(0); } else if(a[9]==2) { i=8; cout<<"第"<<i+1<<"个球是坏球"<<" 重量为"<<b[i]<<endl; exit(0); } } } }