目 录CONTENT

文章目录

小猫钓鱼-c实现

Gz
Gz
2022-05-02 / 0 评论 / 0 点赞 / 313 阅读 / 835 字 / 正在检测是否收录...

小猫钓鱼

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

image-20220502210154409

假如游戏开始时,小哼手中有 6 张牌,顺序为 2 4 1 2 5 6,小哈手中也有 6 张牌,顺序为 3 1 3 5 6 4,最终谁会获胜呢?现在你可以拿出纸牌来试一试。接下来请你写一个程序来自动判断谁将获胜。这里我们做一个约定,小哼和小哈手中牌的牌面只有 1~9。

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

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;
    //初始化stack
    s.top=0;
    //初始化用来标记的数组,用来标记哪些牌已经在桌上
    for (i = 1 ; i <= 9 ; i ++){
        book[i] = 0;
    }
    //依次向队列插入6个数
    //小哼
    for (i = 1 ; i <= 6; i ++) scanf("%d",&q1.data[q1.tail++]);
  
    //小哈
    for (i = 1 ; i <= 6; i ++) scanf("%d",&q2.data[q2.tail++]);
    //当队列不为空的时候执行循环
    while(q1.head < q1.tail && q2.head < q2.tail){
        t = q1.data[q1.head]; //小哼出一张牌
        //判断是否能赢牌
        if(book[t] == 0){ //表明桌面上没有这张牌
            //没赢
            q1.head++;
            s.top++;
            s.data[s.top] = t;
            book[t] = 1;
        } else {
            //赢了
            q1.head++;
            q1.data[q1.tail++] = t;
            //把桌上可以赢得牌依次放到手中牌的末尾
            while (s.data[s.top] != t){
                book[s.data[s.top]] = 0;
                q1.data[q1.tail++] = s.data[s.top--];
            }
        }
        
        //跟上面一样
        t = q2.data[q2.head];
        if(book[t] == 0){
            q2.head++;
            s.top++;
            s.data[s.top] = t;
            book[t] = 1;
        } else {
            q2.head++;
            q2.data[q2.tail++] = t;
            while (s.data[s.top] != t){
                book[s.data[s.top]] = 0;
                q2.data[q2.tail++] = s.data[s.top--];
            }
        }
        
        if(q2.head == q2.tail){
            printf("\n小哼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("\n小哈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桌上已经没有牌了");
            }

        }
        printf("\n");

    }
    return 0;
}

输入:

2 4 1 2 5 6
3 1 3 5 6 4

执行结果:

image-20220502210350442

0

评论区