zoj 1184

 硬币称重,经典,1.若被判平,左右所有硬币必正常;2.若判轻或判重,对应硬币被判轻-1、重记数+1;3.只有球只被判轻或判重,且次数跟天平不平衡次数相等,该球才能是坏的,否则必然是好的。且>0的是偏重,<0是偏轻.

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(void)
{
    int s[15];
    int i,j,t,len1,len2,count=0;
    char str[3][3][13];
    scanf("%d",&t);
    while(t--)
    {
        count=0;/*不平衡的次数*/ 
        for(i=0;i<3 ;i++ )
        scanf("%s%s%s",str[i][0],str[i][1],str[i][2]);
        memset(s,0,sizeof(s));
        for(i=0;i<3;i++)/*找到所有相等的 */
        {
            if(strcmp(str[i][2],"even")==0)
            {
                len1=strlen(str[i][0]);
                for(j=0;j<len1;j++)
                    s[(str[i][0][j]-'A')]=1000;/*赋值1000表示正常*/
                len2=strlen(str[i][1]);
                for(j=0;j<len2;j++)
                    s[(str[i][1][j]-'A')]=1000;        
            }
        }
        for(i=0;i<3;i++)
        {
            if(strcmp(str[i][2],"up")==0)
            {
                count++;
                
                len1=strlen(str[i][0]);/*up说明左边重 */
                for(j=0;j<len1;j++)
                    {
                        if(s[(str[i][0][j]-'A')]!=1000)
                        s[(str[i][0][j]-'A')]++;
                    } 
                len2=strlen(str[i][1]);/*右边比较小 */
                for(j=0;j<len2;j++)
                    {
                        if(s[(str[i][1][j]-'A')]!=1000)
                        {
                            s[(str[i][1][j]-'A')]--;
                        } 
                                
                    } 
            }
        }
        for(i=0;i<3;i++)
        {
            if(strcmp(str[i][2],"down")==0)
            {
                count++;
                
                len1=strlen(str[i][0]);/*down说明左边小 */
                for(j=0;j<len1;j++)
                    {
                        if(s[(str[i][0][j]-'A')]!=1000)
                        {
                            s[(str[i][0][j]-'A')]--;
                        } 
                                
                    } 
                len2=strlen(str[i][1]);/*右边左边都正常 */
                for(j=0;j<len2;j++)
                    {
                        if(s[(str[i][1][j]-'A')]!=1000)
                        {
                            s[(str[i][1][j]-'A')]++;
                        } 
                    }
                
            }
        }
        for(i=0;i<12;i++)
        {
            if(abs(s[i])==count)/*当不平衡的次数和硬币的问题次数相等时,那么该硬币就是问题硬币*/ 
            {
                printf("%c is the counterfeit coin and ",i+'A');
                printf( s[i]<0? "it is light.\n":"it is heavy.\n");
                break;
            }
        }
    }
    
    
    return 0;
}
/*
自己例举的测试实例 
2
ABCD EFGH down
CDEF GHLK even
AEFD JKCD down
B A down
B C even
D F even
*/

 

 

 

posted @ 2014-03-23 20:46  keyboard3  阅读(185)  评论(0编辑  收藏  举报