大一寒假看到的题目,最近翻出了以前编的代码,当时还在用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);
}
}
}
}