纸牌游戏——小猫钓鱼(阿哈!算法)

来源:互联网 发布:手机自制漫画软件 编辑:程序博客网 时间:2024/04/28 12:53

问题描述:

     小哼和小哈在玩一个比较奇怪的扑克游戏——小猫钓鱼。游戏规则:将一副扑克牌平均分成两份,没人拿一分。小哼先拿出手中第一张扑克牌放在桌上,然后小哈也拿出手中第一张扑克牌,并放在小哼刚才打出的扑克牌的上面,两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,可将两张相同的牌及其中间所夹的牌全部拿走,并依次放到自己手中牌的末尾。当任意一人手中当牌出完时,游戏结束,对方获胜。


分析:

1、这个游戏一共有两种操作:出牌和赢牌。

                                                 出牌即出队,赢牌即入队。

2、桌面相当于一个栈,出牌即入栈,赢牌即出栈。

3、通过枚举了解桌面有哪些牌。


思路:

1、定义两个队列q1、q2表示小哼、小哈手中的牌。

2、定义一个栈s表示桌面的牌

3、定义数组book记录桌面上已经出现的牌面

4、游戏开始时q1的队首出队,判断当前时是出牌还是赢牌

     4.1如果是出牌,则入栈

     4.2如果是赢牌,则q1的队首到队尾,再将赢得的牌依次入队

5、q2 的队首出队,操作同4

6、第4、5步重复进行直至任意人手中没有牌

7、输出赢的人手中的牌,输出此时桌面上的牌

代码:

(此部分代码为书上提供)


#include <stdio.h>struct queue{    int  data[1000];    int head;    int hail;};struct stack{    int data[10];    int top;};int main(int argc, const char * argv[]) {    struct queue q1,q2;    struct stack s;    int book[10]={0}; //用来标记哪些牌已经在桌子上    int i,t;        //初始化队列    q1.head=1;    q1.hail= 1;    q2.head=1;    q2.hail=1;    //初始化栈    s.top=0;        //依次向队列输入6个数    for(i=1;i<=6;i++)    {        scanf("%d",&q1.data[q1.hail]);        q1.hail++;    }    for(i=1;i<=6;i++)    {        scanf("%d",&q2.data[q2.hail]);        q2.hail++;    }        while(q1.head<q1.hail&&q2.head<q2.hail)    {        t=q1.data[q1.head];  //q1打出第一张牌        //判断q1当前打出的牌是否能赢牌        if(book[t]==0)// 表面桌上没有牌面为t的牌        {    //q1此轮不能赢牌            q1.head++;//q1打出一张牌,打出的那张牌出队            s.top++;            s.data[s.top]=t;//q1打出的牌入栈            book[t]=1;//标记已打出的牌t        }        else        {//q1此轮可以赢牌            q1.head++;//q1打出第一张牌            q1.data[q1.hail]=t;//q1打出的牌放到队尾            q1.hail++;            while(s.data[s.top]!=t)//将赢得的牌依次入队            {                q1.data[q1.hail]=s.data[s.top];                q1.hail++;                s.top--;                book[s.data[s.top]]=0;//将从桌面入队的牌取消标记            }        }            t=q2.data[q2.head];//q2出牌        if(book[t]==0) //q2此轮不能赢牌        {            q2.head++;            s.top++;            s.data[s.top]=q2.data[q2.head];            book[t]=1;        }        else        { //q2此轮能赢牌            q2.data[q2.hail]=q2.head;            q2.head++;            q2.hail++;            while(s.data[s.top]!=t)            {                q2.data[q2.hail]=s.data[s.top];                q2.hail++;                book[s.data[s.top]]=0;                s.top--;            }        }    }        if(q2.head==q2.hail)    {        printf("q1 win!\n");        printf("q1当前手中的牌是:\n");        for(i=q1.head;i<q1.hail;i++)        {            printf("%d ",q1.data[i]);        }                if(s.top>0)//        {            printf("\n桌上的牌是:\n");            for(i=1;i<=s.top;i++)            {                printf("%d ",s.data[i]);            }        }        else            printf("\n桌上已经没有牌!\n");    }    else        if(q1.head==q1.hail)        {            printf("q2 win!\n");            printf("q2当前手中的牌是:\n");            for(i=q2.head;i<q2.hail;i++)            {                printf("%d ",q2.data[i]);            }                        if(s.top>0)//            {                printf("\n桌上的牌是:\n");                for(i=1;i<=s.top;i++)                {                    printf("%d ",s.data[i]);                }            }            else                printf("\n桌上已经没有牌!\n");        }    getchar();    getchar();    return 0;}






0 0
原创粉丝点击