PAT B1018 锤子剪刀布

本文分享了一段使用C语言实现的游戏博弈程序代码,并详细记录了调试过程中遇到的多个问题及解决方案,包括输入处理、逻辑错误及数组操作等方面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//严重注意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;
}

### 关于 PAT 1018 的 Java 编程题解 对于 PAT (Programming Ability Test) 中编号为 1018 的题目,在使用 Java 解决该类问题时确实存在一些挑战,尤其是在性能方面。考虑到部分考生反馈使用 Java 可能会遇到超时的情况[^4]。 #### 使用高效算法优化输入输出操作 为了提高效率并避免因 I/O 操作而导致的时间消耗过多,可以采用 `BufferedReader` 和 `StringTokenizer` 来替代传统的 `Scanner` 类来进行快速的数据读取: ```java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); // 假设此处处理逻辑... } } ``` #### 利用合适的数据结构解决问题 针对特定类型的计算任务选用恰当的数据结构能够显著提升程序执行速度。例如当涉及到频繁查询某个数值是否存在于集合内的情景下,优先考虑哈希表(HashSet 或 HashMap),而不是列表形式存储数据。 #### 示例解答框架 下面给出一段简化版的代码片段用于说明如何构建一个基本框架去解决此类竞赛型编程试题: ```java // 导入必要的包 import java.io.*; import java.util.*; class Solution { private static final int MAXN = ...; // 定义最大可能范围 public static void solve(BufferedReader reader, BufferedWriter writer) throws Exception{ // 初始化变量 // 处理输入 // 执行核心运算逻辑 // 输出结果至writer对象中 } public static void main(String[] args)throws Exception { try( BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out)) ){ solve(reader, writer); } } } ``` 需要注意的是上述模板仅为示意性质,并未提供具体的业务逻辑实现细节;实际编写过程中需依据官方文档描述的具体需求完成相应功能模块的设计与编码工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值