啊哈!算法—小猫钓鱼(Java实现)

算法 专栏收录该内容
1 篇文章 0 订阅

星期天小哼和小哈约在一起玩桌游,他们正在玩一个非常古怪的扑克游戏——“小猫钓鱼”。游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份。小哼先拿出手中的第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,并放在小哼刚打出的扑克牌的上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人手中的牌全部出完时,游戏结束,对手获胜。

        //a手牌
        LinkedList<Integer> a = new LinkedList<>();
        //b手牌
        LinkedList<Integer> b = new LinkedList<>();

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入手牌个数:");
        //手牌个数
        int n = scanner.nextInt();

        System.out.println("请输入a的手牌:");
        for (int i = 0; i < n ; i++){
            a.addLast(scanner.nextInt());
        }

        System.out.println("请输入b的手牌:");
        for (int i = 0; i < n ; i++){
            b.addLast(scanner.nextInt());
        }

        //定义一个栈,用来放置桌面手牌
        Stack<Integer> stack = new Stack();
        System.out.println("游戏开始!");

        //有一人手牌为空即为游戏结束
        while ( !a.isEmpty() && !b.isEmpty()){
            int x = a.removeFirst();
            if (a.isEmpty()){
                //a获胜
                break;
            }else {
                if (stack.contains(x)){
                    //如果栈中有这张牌,a收牌
                    a.addLast(x);
                    int index = stack.search(x);
                    for(int i = 0; i<index;i++){
                        a.addLast(stack.pop());
                    }
                }else {
                    //添加到栈中
                    stack.push(x);
                    //B出牌
                    int y = b.removeFirst();
                    if (b.isEmpty()){
                        //b获胜
                        break;
                    }else {
                        if (stack.contains(y)){
                            //如果栈中有这张牌,b收牌
                            b.addLast(y);
                            int index = stack.search(y);
                            for(int i = 0; i<index;i++){
                                b.addLast(stack.pop());
                            }
                        }else {
                            stack.push(y);
                        }
                    }
                }
            }
        }
        if (a.isEmpty()){
            System.out.println("a获胜!");
        }
        if (b.isEmpty()){
            System.out.println("b获胜!");
        }
        System.out.println("游戏结束!");

原书C语言算法

#include <stdio.h>
struct queue{
 int data[1000];
 int head;
 int tail;
}; 

struct stack{
 int data[10];
 int top;
}; 

int main(){
 struct queue q1,q2;
 struct stack s;
 int book[10];
 int i,t;

 //初始化队列
 q1.head=1; q1.tail=1;
 q2.head=1; q2.tail=1;

 //初始化栈
 s.top=0;

 //初始化用来标记的数组,用来标记哪些牌已经在桌上
 for(i=1;i<=9;i++)
 book[i]=0;

 //依次向队列插入6个数
 //小哼手上的6张牌
 for(i=1;i<=6;i++){
     scanf("%d",&q1.data[q1.tail]);
     q1.tail++;
 }
 //小哈手上的6张牌
 for(i=1;i<=6;i++){
     scanf("%d",&q2.data[q2.tail]);
     q2.tail++;
 }
 //当队列不为空的时候执行循环
 while(q1.head<q1.tail && q2.head<q2.tail ) {
     t=q1.data[q1.head];//小哼出一张牌
     //判断小哼当前打出的牌是否能赢牌
     if(book[t]==0) {
        //表明桌上没有牌面为t的牌
        //小哼此轮没有赢牌
        //小哼已经打出一张牌,所以要把打出的牌出队
         q1.head++; 
         s.top++;
         s.data[s.top]=t; //再把打出的牌放到桌上,即入栈
         book[t]=1; //标记桌上现在已经有牌面为t的牌
     }else{
         //小哼此轮可以赢牌
         q1.head++;//小哼已经打出一张牌,所以要把打出的牌出队
         q1.data[q1.tail]=t;//紧接着把打出的牌放到手中牌的末尾
         q1.tail++;
         while(s.data[s.top]!=t) //把桌上可以赢得的牌依次放到手中牌的末尾
         {
             book[s.data[s.top]]=0;//取消标记
             q1.data[q1.tail]=s.data[s.top];//依次放入队尾
             q1.tail++;
             s.top--; //栈中少了一张牌,所以栈顶要减1
         }
     }

     t=q2.data[q2.head]; //小哈出一张牌
     //判断小哈当前打出的牌是否能赢牌
     if(book[t]==0) //表明桌上没有牌面为t的牌
     {
         //小哈此轮没有赢牌
         q2.head++; //小哈已经打出一张牌,所以要把打出的牌出队
         s.top++;
         s.data[s.top]=t; //再把打出的牌放到桌上,即入栈
         book[t]=1; //标记桌上现在已经有牌面为t的牌
     }
     else
     {
         //小哈此轮可以赢牌
         q2.head++;//小哈已经打出一张牌,所以要把打出的牌出队
         q2.data[q2.tail]=t;//紧接着把打出的牌放到手中牌的末尾
         q2.tail++;
         while(s.data[s.top]!=t) //把桌上可以赢得的牌依次放到手中牌的末尾
             {
                 book[s.data[s.top]]=0;//取消标记
                 q2.data[q2.tail]=s.data[s.top];//依次放入队尾
                 q2.tail++;
                 s.top--;
             }
     }
 }

 if(q2.head==q2.tail){
     printf("小哼win\n");
     printf("小哼当前手中的牌是");
     for(i=q1.head;i<=q1.tail-1;i++)
         printf(" %d",q1.data[i]);
     if(s.top>0) //如果桌上有牌则依次输出桌上的牌
     {
         printf("\n桌上的牌是");
         for(i=1;i<=s.top;i++)
             printf(" %d",s.data[i]);
      }
     else
         printf("\n桌上已经没有牌了");
      }
 else
 {
     printf("小哈win\n");
     printf("小哈当前手中的牌是");
     for(i=q2.head;i<=q2.tail-1;i++)
         printf(" %d",q2.data[i]);
     if(s.top>0) //如果桌上有牌则依次输出桌上的牌
     {
         printf("\n桌上的牌是");
         for(i=1;i<=s.top;i++)
             printf(" %d",s.data[i]);
     }
     else
         printf("\n桌上已经没有牌了");
     }
 getchar();getchar();
 return 0;
} 

 

  • 0
    点赞
  • 0
    评论
  • 4
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页

打赏作者

Hakka_Stephen

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值