PAT B1018 锤子剪刀布

来源:互联网 发布:土地利用现状数据价格 编辑:程序博客网 时间:2024/05/21 10:03
//严重注意scanf()格式化输入字符的时候不忽略空格,因此为了正确输入数据,必须把空格吸收
//第三个bug:书上结果是532 235 BB 我是235 532 JJ.说明逻辑还是有问题
//第四个bug,无法把数组的最大的元素的下标求出并且转化为字符
#include<stdio.h>
int change(char c){
    //B是布,C是锤头,J是剪刀.这里是bug3,注释和代码不匹配,导致我检查逻辑时看的是这里
    if(c=='B') return 0;
    if(c=='C') return 1;
    if(c=='J') return 2;
    //因为(2+1)%3刚好等于0,因为需要加1才能达到,所以C是比B小的
}
char change2(int i){
    if(i==0) return 'B';
    if(i==1) return 'C';
    if(i==2) return 'J';
}

int main(){
    //第二个是按照胡凡书上的样例,我的结果是2 2 6,答案不正确,一开始觉得可能是逻辑问题,检查逻辑觉得没有问题,后来检查发现y和j没有初始化,初始化之后终于ac了
    int n=0,i=0,j=0,y=0;//甲胜利则j+1,乙胜利则y+1,最后如果j+y总和小于n,则减去等于平局的数目
    char c1,c2;
    int i1,i2;
    int A[3]={0},B[3]={0};//甲胜利时给甲加这个数组中的胜利的对应数字0,1,2的一个。乙胜则为乙的数组加。最后分别比较各数组自己的元素
    //为了节约内存,少去设置数组,这样这里就不用设置两个长度为10的数组了
    //char temp;
    scanf("%d",&n);
    //while(scanf("%c %c",&a[i],b[i])!=0){
    for(int i=0;i<n;i++){
        //先吸收掉缓存中的\n,此时键盘缓存中因为刚刚一个%d接受了,\n是为了促进接受,这个\n还留在键盘缓存中
        getchar();//直接用这个函数吸收
        scanf("%c %c",&c1,&c2);//第一个bug,这个地方一开始因为没加&,造成段越界什么的。
        i1=change(c1);
        i2=change(c2);
        //本来我想重写一下大于小于号的,心里没什么底,看到这个觉得这个想法也挺好的
        //如果纯用if,也就9种情况吧,这个还不算太恐怖
        //三种情况:因为不管双方出什么,不是甲胜就是乙胜就是平局,我相处了这三种算数情况,应该没有其他情况了。
        //至少出现任何情况,都可以满足下列三式中的某一个式子
        //(i1+1)%3=i2;i1=i2;i1=(i2+1)%3
        if((i1+1)%3==i2){
               /*y++;
            B[i2]++;就是bug3的错误
            */
            j++;//说明甲赢了
            A[i1]++;//把A赢的是用哪个赢的记录下来
        }
        else if(i1==i2){
            //这个地方胜负的肯定是不加了,数组应该也不加吧,因为没有人赢,所以不需要记录赢的是出哪个赢的
        }
        else if((i2+1)%3==i1){
            y++;
            B[i2]++;
        }
    }
    //最后一起输出
    int p=n-j-y;
    printf("%d %d %d\n",j,p,y);
    printf("%d %d %d\n",y,p,j);
//    printf("%c %c\n",change2(A[0]>A[1]?(A[0]>A[2]?A[0]:A[2]):(A[1]>A[2]?A[1]:A[2])),change2(B[0]>B[1]?(B[0]>B[2]?B[0]:B[2]):(B[1]>B[2]?B[1]:B[2])));

   //下面这段自己一定要再多看几次

   int id1=0,id2=0;

    for(int i=0;i<3;i++){
        if(A[i]>A[id1]) id1=i;
        if(B[i]>B[id2]) id2=i;//这个厉害了,这个是排序啊,一开始我想的做法太麻烦了。这个方法好,深刻理解了排序。用排序的算法来找出最大的数下标
    }
    printf("%c %c\n",change2(id1),change2(id2));//转变回字符型啊
    return 0;
}

0 0
原创粉丝点击