zoukankan      html  css  js  c++  java
  • 啊哈,算法自学记——3rd

    队列:(先进先出FIFO)

    	小哈给了小哼一串加密过的数字,同时小哈也告诉了小哼解密规则。
    	规则是这样的:首先将第 1 个数删除,紧接着将第 2 个数放到这串数的尾,
    	再将第 3 个数删除并将第 4 个数放到这串数的末尾,再将第 5 个数删除……
    	直到剩下最后一个数,将最后一个数也删除。按照刚才删除的顺序,把这些删除的数连在一起就是小哈的 QQ 啦
    

    我自己题都没看懂,简单来说就是,从头部取两位,把第一位删除,把第二位续到剩下的数的后面,然后!!!删除的数才是结果。。。

    在这里插入图片描述

    #include <stdio.h>
    
    typedef struct queen
    {
        int data[101];
        int head;
        int tail;
    };
    
    int main(int argc, char const *argv[])
    {
        struct queen q;
        q.head=0;
        q.tail=0;
    
        printf("Input 9 num:
    ");
        for (int i = 0; i < 9; i++)//录入9个数
        {
            scanf("%d",&q.data[q.tail]);
            q.tail++;
        }
    
        while (q.head<q.tail)//当队列不为空
        {
            //打印队首
            printf("%d",q.data[q.head]);//删除的才是需要的
            q.head++;//这里删除第一位,这里已经是指向第二位了,只是为了把第二位放到tail+1位
    
            //将新的队首的数放置队尾+1
            q.data[q.tail]=q.data[q.head];//续数
            q.tail++;//尾部下标+1,往后延
            //再将队首出队
            q.head++;//第二位已经用过了,这里把第二位删除
        }
    
        return 0;
    }
    
    

    栈(先进后出)

    验证字符串是否是回文(例如:aha,123321)

    #include <stdio.h>
    #include <string.h>
    
    
    int main(int argc, char const *argv[])
    {
        char a[101],s[101];
    
        int next,len,mid,top;
    
        printf("Input a string:
    ");
        gets(a);//读取一个字符串
        len =strlen(a);//读取字符串长度
    
        mid=len/2-1;//字符串中点
    
        top=0;//栈初始化
    
        //将mid前面的字符串入栈
        for (int i = 0; i <= mid; i++)
        {
            s[++top]=a[i];
        }
    
        if (len%2==0)//判断回文是偶数个字符还是奇数个字符
        {
            next=mid+1;
        }
        else
        {
            next=mid+2;
        }
    
        //开始匹配
        for (int i = next; i < len; i++)
        {
            if (a[i]!=s[top])//a[i]是字符串从中点开始以后的字符,s[top]是栈自顶之下的字符
            {
                break;
            }
            top--;
        }
    
        if (top==0)//如果能一一匹配则是回文
        {
            printf("YES
    ");
        }
        else
        {
            printf("NO
    ");
        }
    
        return 0;
    }
    
    

    纸牌游戏——小猫钓鱼(俗称:接竹竿

    游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份。小哼先拿出手中的第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,并放在小哼刚打出的扑克牌的上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人手中的牌全部出完时,游戏结束,对手获胜。(这不就是接竹竿嘛,())
    假如游戏开始时,小哼手中有 6 张牌,顺序为 2 4 1 2 5 6,小哈手中也有 6 张牌,顺序为 3 1 3 5 6 4,最终谁会获胜呢?

    #include <stdio.h>
    #include <string.h>
    //定义一个结构体
    typedef struct queen
    {
        int data[101];
        int head;
        int tail;
    };
    
    typedef struct stack
    {
        int data[10];
        int top;
    };
    
    int main(int argc, char const *argv[])
    {
        //定义两个结构体,代表两人手中的牌
        struct queen q1,q2;
        struct stack  s;//定义一个栈,代表放在桌面的牌
        int book[10];//用来比较是否能收牌
        int i,t;
    
        q1.head=0;
        q1.tail=0;
    
        q2.head=0;
        q2.tail=0;
    
        s.top=0;//栈初始化
    
        for (int i = 0; i < 9; i++)//标记那些牌已经放在桌子上
        {
            book[i]=0;
        }
        
    
        //首先加载两人手中的牌
        printf("Input six num for q1:
    ");
        for (int i = 0; i < 6; i++)//每人只有六张牌
        {
            scanf("%d",&q1.data[q1.tail]);
            q1.tail++;
        }
    
        printf("Input six num for q2:
    ");
        for (int  i = 0; 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];//q1先出牌了
            //判断是否能收牌
            if (book[t]==0)//不能赢牌;类似于桶排序中的检测方法,如果=0那肯定是没有出现过t
            {
                q1.head++;//把q1打出的牌出队,删掉
                s.top++;
                s.data[s.top]=t;//把打出的牌入栈,也就是放到桌面上
                book[t]=1;//标记桌面上有t这张牌
            }
            else//可以收牌
            {
                q1.head++;//把q1打出的牌出队,删掉
                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--;
                }
                
            }
            
            t=q2.data[q2.head];//q2出牌了
            //判断是否能收牌
            if (book[t]==0)//不能赢牌;类似于桶排序中的检测方法,如果=0那肯定是没有出现过t
            {
                q2.head++;//把q2打出的牌出队,删掉
                s.top++;
                s.data[s.top]=t;//把打出的牌入栈,也就是放到桌面上
                book[t]=1;//标记桌面上有t这张牌
            }
            else//可以收牌
            {
                q2.head++;//把q2打出的牌出队,删掉
                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 (q1.head==q1.tail)//q1木牌了,输了
        {
            printf("Q2  Win 
    ");
            printf("Q2 have :
    ");
    
            for (int i = q2.head; i < q2.tail; i++)
            {
                printf("--%d",q2.data[i]);
            }
    
            if (s.top>0)//桌上还有牌
            {
                printf("
    Desktop have:
    ");
                for (int i = 1; i <= s.top; i++)
                {
                    printf("  %d",s.data[i]);
                }
                
            }
            else
            {
                printf("No puke
    n");
            }
        }
        else if(q2.head==q2.tail)
        {
            printf("Q1  Win 
    ");
            printf("Q1 have :
    ");
    
            for (int i = q1.head; i < q1.tail; i++)
            {
                printf("--%d",q1.data[i]);
            }
    
            if (s.top>0)//桌上还有牌
            {
                printf("
    Desktop have:
    ");
                for (int i = 1; i <= s.top; i++)
                {
                    printf("  %d",s.data[i]);
                }
                
            }
            else
            {
                printf("No puke
    n");
            }
        }
        
        
    
        return 0;
    }
    
    

    在这里插入图片描述

  • 相关阅读:
    .NET 事件模型教程(一)
    [转帖]Predicate的用法
    MSBuild入门(续)
    浅析C# 中object sender与EventArgs e
    调用一个按钮的Click事件(利用反射)
    Delegate,Action,Func,匿名方法,匿名委托,事件
    投票系统如何防止一个用户多次投票
    如何发送表单
    SharePoint NLB选Unicast还是选Multicast?
    为SharePoint的多台WFE配置Windows自带的NLB遇到的一个问题
  • 原文地址:https://www.cnblogs.com/hhsxy/p/14018432.html
Copyright © 2011-2022 走看看