Aha code Two

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Aha code Two相关的知识,希望对你有一定的参考价值。

1. 解密QQ号-队列

a.解密算法
#include <stdio.h> int main(void) { int q[102] = {0,6,3,1,7,5,8,9,2,4}, head, tail; int i; //初始化队列 head = 1; tail = 10; //队列中已经有9个元素了,tail指向队尾的后一个位置 while(head < tail)//当队列不为空的时候执行循环 { //打印队首并将队首出队 printf("debug in here 1\n"); printf("%d ", q[head]); head++; //先将新队首的数添加到队尾 q[tail] = q[head]; tail++; //再将队首出队 head++; printf("tail=%d head=%d\n", tail, head); } getchar(); getchar(); return 0; }
终端输出:
debug in here 1
6 tail=11 head=3
debug in here 1
1 tail=12 head=5
debug in here 1
5 tail=13 head=7
debug in here 1
9 tail=14 head=9
debug in here 1
4 tail=15 head=11
debug in here 1
7 tail=16 head=13
debug in here 1
2 tail=17 head=15
debug in here 1
8 tail=18 head=17
debug in here 1
3 tail=19 head=19

 

b.解密算法(利用结构体)
#include <stdio.h> struct queue { int data[100];//队列的主体,用来存储内容 int head;//队首 int tail;//队尾 }; int main() { struct queue q; int i, n; //初始化队列 q.head=1; q.tail=1; printf("向队列插入待解密的数的个数是:\n"); scanf("%d", &n); printf("依次插入%d个数为:", n); for(i=1;i<=n;i++) { //依次向队列插入5个数 scanf("%d",&q.data[q.tail]); q.tail++; } printf("打印解密后的数为:"); while(q.head < q.tail) //当队列不为空的时候执行循环 { //打印队首并将队首出队 printf("%d ",q.data[q.head]); q.head++; //先将新队首的数添加到队尾 q.data[q.tail] = q.data[q.head]; q.tail++; //再将队首出队 q.head++; } getchar();
getchar();
return 0; }
终端输出
向队列插入待解密的数的个数是:
5
依次插入5个数为:1 2 3 4 5
打印解密后的数为:1 3 5 4 2

 

2. 解密回文-栈

#include <stdio.h>
#include <string.h>
int main()
{
    char a[101],s[101];
    int i,len,mid,next,top;
    gets(a); //读入一行字符串
    len=strlen(a); //求字符串的长度
    mid=len/2-1; //求字符串的中点
    printf("len=%d, mid=%d\n", len, mid);
    top=0;//栈的初始化
    //将mid前的字符依次入栈
    for(i=0;i<=mid;i++)
        s[++top]=a[i];
    //判断字符串的长度是奇数还是偶数,并找出需要进行字符匹配的起始下标
    if(len%2==0)
        next=mid+1;
    else
        next=mid+2;
    //开始匹配
    for(i=next;i<=len-1;i++)
    {
        if(a[i]!=s[top])
            break;
        top--;
    }
    //如果top的值为0,则说明栈内所有的字符都被一一匹配了
    if(top==0)
        printf("YES");
    else
        printf("NO");
    getchar();
    getchar();
    return 0;
}
/*编译执行
[email protected]:~/Documents/Exec_important/aha/two_chapter$ ./2_huiwen 
asdfdsa
len=7, mid=2
YES

[email protected]:~/Documents/Exec_important/aha/two_chapter$ ./2_huiwen 
asddfdsa
len=8, mid=3
NO
*/

 

3. Cat Fishing

#include <stdio.h>

struct queue
{
    int data[1000];
    int head;
    int tail;
};

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

int main(void)
{
    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;
}
/* 编译 执行:
[email protected]:~/Documents/Exec_important/aha/two_chapter$ ./3_cat_fishing 
2 4 1 2 5 6
3 1 3 5 6 4
小哼win
小哼当前手中的牌是 5 6 2 3 1 4 6 5
桌上的牌是 2 1 3 4
*/

 

4. 链表

 

以上是关于Aha code Two的主要内容,如果未能解决你的问题,请参考以下文章

优化算法人工蜂鸟优化算法(AHA)含Matlab源码 1470期

优化算法人工蜂鸟优化算法(AHA)含Matlab源码 1470期

优化算法人工蜂鸟算法(AHA)含Matlab源码 1543期

VS code自定义用户代码片段snippet

Sublime Text自定制代码片段(Code Snippets)

vs code 自定义代码片段