POJ1013称硬币问题

//有一打(12枚)硬币,其中有且仅有1枚假币,11枚真币
//
//用A~L作为各个硬币的代号
//
//假币可能比真币略轻,也可能略重
//
//现在利用天枰,根据Input输入的3次称量,找出假币,并输出假币是轻还是重。
//Up:右盘上升,说明右盘可能有轻假币,也可能左盘有重假币。

//Down:右盘下降,说明右盘可能有重假币,也可能左盘有轻假币。

//Even:右盘与左盘平衡,由于假币有且仅有1枚,则说明此时天枰两边的硬币全为真币。

//输入样例 :
//1
//ABCD EFGH even
//ABCI EFJK up
//ABIJ EFGH even
//输出样例:
//K is the counterfeit coin and it is light. (K是伪造的硬币,它很轻。)

#include 
#include  
using namespace std;
char Left[3][7];//天平左侧硬币 
char Right[3][7];//天平右侧硬币 
char result[3][7];//结果 
bool IsFake(char c,bool light);//c 表示硬币真假 light 表示硬币轻重 (0 真 1 假  0 重 1 轻)
int main()
{int t;cin >> t;while(t--){for(int i = 0;i < 3;++i){cin >> Left[i] >>Right[i] >> result[i];//接入三组输入数据 }for(char c = 'A';c <= 'L';c++)//遍历12个硬币 {if(IsFake(c,true))//1为轻 {cout << " is the counterfeit coin and it is light." << endl; break;}else if(IsFake(c,false)){cout << "K is the counterfeit coin and it is heary." << endl;break;} }}return 0;
} 
bool IsFake(char c,bool light)
{for(int i = 0;i < 3;i++){char *pLeft,*pRight;//天平两边的字符串if(light)//轻 {pLeft = Left[i];pRight = Right[i];} else //重 {pLeft = Right[i];pRight = Left[i];}switch (result[i][0]) //均为天平右边 {case 'u': {//strchar()返回在字符串 pRight 中第一次出现字符 c 的位置,如果未找到该字符则返回 NULLif(strchr(pRight,c) == NULL){return false;//天平右边翘起  }break;}case 'e': {if(strchr(pLeft,c) || strchr(pRight,c)){return false;}break;}case 'd':{if(strchr(pLeft,c) == NULL){return false;//天平左边翘起 }break;} }}return true;
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部