您的位置:首页 > Web前端

Counterfeit Dollar(poj1013暴力枚举)

2013-05-31 21:01 393 查看
题意:有A-L个标号的硬币,其中有一个是假币,你不知道假币的轻重,现在给你三个字符串,up代表右面轻,down右面重,even代表两面相等,找出假币并且判断轻重

思路:因为只有A-L个硬币所以枚举一下,假设A是假币,然后判断一下是否满足那三个条件,满足条件的保存

怎么是满足条件,除了不满足条件的,剩下的都满足条件。

不满足条件的

1.两面相等的字符串出现假币,说明假设不成立。

2.右面轻的字符串出现假币在左面轻或者在右面重,说明假设也不成立。

3.右面重的字符串出现假币在左面中或者在右面轻,说明假设也不成立。

不满足上面条件就是假币。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char L[3][10];
char R[3][10];
char heav[3][10];
struct coin
{
char c;
int flag;
};
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int i,j;
for(i = 0; i < 3; i++)
{
scanf("%s%s%s",L[i],R[i],heav[i]);
}
coin a;a.c = 'A',a.flag = -1;
int f;
for(i = 0; i < 12; i++)
{
int flag_L = 0,flag_R = 0;f = -1;
for(j = 0; j < 3; j++)
{
flag_L = 0,flag_R = 0;
int len;
int len_L = strlen(L[j]),len_R = strlen(R[j]);
for(len = 0; len < len_L; len++)
{
if((i+'A') == L[j][len])
flag_L = 1;
}
for(len = 0; len < len_R; len++)
{
if((i+'A') == R[j][len])
flag_R = 1;
}
if(strcmp(heav[j],"even") == 0 )
{
if(flag_L || flag_R)
{
break;
}
}
else if(strcmp(heav[j],"up") == 0)
{//printf("%c\n",i+'A');
if(flag_R && f == 0)
break;
if(flag_L && f == 1)
break;
if(!flag_R && !flag_L)
break;
if(flag_R)
{
f = 1;
}
else if(flag_L)
{
f = 0;
}
}
else if(strcmp(heav[j],"down") == 0)
{
if(flag_L && f == 0)
break;
if(flag_R && f == 1)
break;
if(!flag_R && !flag_L)
break;
if(flag_L)
{
f = 1;
}
if(flag_R)
{
f = 0;
}
}
}
if(j == 3)
{
a.c = i+'A';
a.flag = f;
}
}
if(a.flag == 0)
printf("%c is the counterfeit coin and it is heavy.\n",a.c);
else
printf("%c is the counterfeit coin and it is light.\n",a.c);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: