POJ1013(附C语言AC代码)

1013Harvest
我用的是C语言来完成的,其实用指针可能会方便一些,鉴于不太会用指针,所以我避开了这个知识点。
我在思路上碰到的一些小坎坷:
1、搞不清楚轻重:
一定要知道不论是高还是低,都是按照右边的秤而言的,如果左边秤中某一美元有问题,秤相对高,就说明,左边秤有问题的美元偏重。
2、漏用条件:
很难表达,例子来凑:
ABCDEF GHIJKL up
ABC DEF even
I J down
仔细推算,这组数据I偏轻,但是真的用程序运行,给出的结果很有可能是GHIKL偏轻,当然也有的人是G偏轻。先不看结果是否正确,GHIKL偏轻确实符合这三个例子的要求。这样说,可能就发现问题了,GHKL偏轻确实符合要求,但是如果这样的话,第三个例子就没有用到了。
以上为在思路上碰到的问题。
我编写程序碰到的一些小坎坷:
1、读入数据:
(1)字符串中空格后的数据都读不进去,因而左边、右边以及结果需要分开读入;
(2)最好用 memset 把数据清0,避免读取错误;
(3)开数组的时候要注意数据大小,不要只看到例子中给定的数据大小,这道题的读入数据有大有小,并不固定。
2、读取给定样例中左边或右边有多少字符:
数组开的是二维数组。
以上为编写程序遇到的问题。

#include<stdio.h>
#include<string.h>
int m[3];//读取每行左边或右边美元个数
int num[13];
char r[3][13];
char l[3][13];
char res[3][5];
int sflag(int i);
int main()
{
    int i,j,k,h;
    int flag;
    scanf("%d",&k);
    for(h=0; h<k; h++)
    {
        memset(m,0,sizeof(m));
        memset(num,0,sizeof(num));
        memset(r,'0',sizeof(r));
        memset(l,'0',sizeof(l));
        memset(res,'0',sizeof(res));
        for(i=0; i<3; i++)//输入相应字符串
        {
            scanf("%s",l[i]);
            scanf("%s",r[i]);
            scanf("%s",res[i]);
        }
        for(i=0; i<3; i++)//每一行有多少个字符
        {
            j=0;
            while(l[i][j]>='A'&&l[i][j]<='L')
            {
                m[i]++;
                j++;
            }
        }
        for(i=0; i<3; i++)//找出可能有问题的字符
        {
            if(res[i][0]=='e')
            {
                for(j=0; j<m[i]; j++)
                {
                    num[l[i][j]-'A']=1;
                    num[r[i][j]-'A']=1;
                }
            }
            if(res[i][0]=='u'||res[i][0]=='d')
            {
                for(j=0; j<m[i]; j++)
                {
                    if(num[l[i][j]-'A']!=1)
                        num[l[i][j]-'A']=2;
                    if(num[r[i][j]-'A']!=1)
                        num[r[i][j]-'A']=2;
                }
            }
        }
        for(i=0; i<13; i++)
        {
            if(num[i]==2)
            {
                flag=sflag(i);
                if(flag==1)
                {
                    printf("%c is the counterfeit coin and it is heavy.\n",'A'+i);
                }
                if(flag==0)
                {
                    printf("%c is the counterfeit coin and it is light.\n",'A'+i);
                }
            }
        }
    }
    return 0;
}
int sflag(int i)
{
    int count,count1,count2;
    int j,a;
    count=count1=count2=0;
    int flag=2;
    for(j=0; j<3; j++)
    {
        if(res[j][0]!='e')
            count++;
        for(a=0; a<m[j]; a++)
        {
            if(r[j][a]=='A'+i)
            {
                if(res[j][0]=='d')
                {
                    count1++;
                    break;
                }
                if(res[j][0]=='u')
                {
                    count2++;
                    break;
                }
            }
            if(l[j][a]=='A'+i)
            {
                if(res[j][0]=='u')
                {
                    count1++;
                    break;
                }
                if(res[j][0]=='d')
                {
                    count2++;
                    break;
                }
            }
        }
    }
    if(count1==count)
        flag=1;
    if(count2==count)
        flag=0;
    return flag;
}

写的比较繁琐,但是容易理解。有什么问题的话希望大家能够指出来,谢谢啦。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值