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

*/

 

 

 

你可能感兴趣的:(ZOJ)