有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); } } } }



转载于:https://www.cnblogs.com/jzdwajue/p/7127470.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值