啊哈算法Demo

根据《啊哈算法》书籍,自己跟着敲的Demo,慢慢的添加,当做记录。
前1至4章,中间有部分demo没有敲。

//
//  main.c
//  ahasuanfa
//
//  Created by pacino on 16/7/22.
//  Copyright © 2016年 pacino. All rights reserved.
//

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

/**
 *  010101 代表第一章第一节第一个demo
 */
void test010101()
{
    int a[10];
    int i, t;

    for (i = 0; i < 10; i++) {
        a[i] = 0;
    }

    printf("请输入数据:");
    for (i = 0; i < 5; i++) {
        scanf("%d", &t);
        a[t]++;
    }

    for (i = 0; i < 10; i++) {
        for (int j = 0; j < a[i] ; j++) {
            printf("%d\t", i);
        }
    }

    getchar();
    getchar();
}

void test010102()
{
    int  n = 1000;
    int a[n];
    int i, t;

    for (i = 0; i <= n; i++) {
        a[i] = 0;
    }

    printf("请输入数据:");
    for (i = 0; i < 10; i++) {
        scanf("%d", &t);
        a[t]++;
    }

    for (i = n; i >= 0; i--) {
        for (int j = 0; j < a[i] ; j++) {
            printf("%d\t", i);
        }
    }

    getchar();
    getchar();
}

void test010201()
{
    int i, j, n;

    printf("输入一个数n,表示接下来要输入n个数:\n");
    scanf("%d", &n);
    int a[n];

    printf("请输入数:\n");
    for (i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }

    for (i = 0; i < n - 1; i++) {
        for (j = 0; j < n - i; j++) {
            if (a[j] > a[j + 1]) {
                a[j] ^= a[j + 1];
                a[j + 1] ^= a[j];
                a[j] ^= a[j + 1];
            }
        }
    }

    for (i = 0; i < n; i++) {
        printf("%d\t", a[i]);
    }

    getchar();
    getchar();
}

void test010202()
{
    struct student {
        char name[21];
        int score;
    };

    int i, j, n;

    printf("输入一个数n,表示接下来要输入人数:\n");
    scanf("%d", &n);

    struct student a[n];
    struct student temp;

    printf("请输入数:\n");
    for (i = 0; i < n; i++) {
        scanf("%s %d", a[i].name, &a[i].score);
    }

    for (i = 0; i < n - 1; i++) {
        for (j = 0; j < n - i - 1; j++) {
            if (a[j].score > a[j + 1].score) {
                temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
            }
        }
    }

    printf("运行结果:\n");
    for (i = 0; i < n; i++) {
        printf("%s\t%d\n", a[i].name, a[i].score);
    }

    getchar();
    getchar();

}


void quickSort010301(int a[], int left, int right)
{
    if (left >= right) {
        return;
    }

    int i = left;
    int j = right;

    while (i != j) {

        while (a[left] <= a[j] && i < j) {
            j--;
        }
        while (a[left] >= a[i] && i < j) { //  刚开始left和i是同一位置,所以必须 >=
            i++;
        }

        if (i < j) {
            a[i] ^= a[j];
            a[j] ^= a[i];
            a[i] ^= a[j];
        }
    }

    a[i] ^= a[left];
    a[left] ^= a[i];
    a[i] ^= a[left];

    quickSort010301(a, left, i - 1);
    quickSort010301(a, i + 1, right);

}

void test010301()
{
    int i, n;

    printf("输入一个数n,表示接下来要输入n个数:\n");
    scanf("%d", &n);
    int a[n];

    printf("请输入数:\n");
    for (i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }

    quickSort010301(a, 0, n -1);

    for (i = 0; i < n; i++) {
        printf("%d\t", a[i]);
    }

    getchar();
    getchar();

}


void test010401()
{
    int i, n, temp;
    int a[1000];

    for (i = 0; i < 1000; i++) {
        a[i] = 0;
    }

    printf("输入一个数n,表示接下来要输入n个数:\n");
    scanf("%d", &n);

    printf("请输入数:\n");
    for (i = 0; i < n; i++) {
        scanf("%d", &temp);
        a[temp] = 1;
    }

    for (i = 0; i < 1000; i++) {
        if (a[i]) {
            printf("%d\t", i);
        }
    }

    getchar();
    getchar();

}


void test010402()
{
    int i, n;

    printf("输入一个数n,表示接下来要输入n个数:\n");
    scanf("%d", &n);
    int a[n];

    printf("请输入数:\n");
    for (i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }

    quickSort010301(a, 0, n -1);

    printf("%d\t", a[0]);
    for (i = 1; i < n; i++) {
        if (a[i] == a[i - 1]) continue;
        printf("%d\t", a[i]);
    }

    getchar();
    getchar();
}

void test020101()
{
    int a[] = {6, 3, 1, 7, 5, 8, 9, 2, 4};
    int head = 0;
    int tail = 8;

    while (head <= tail) {
        printf("%d\t", a[head]);
        head++;
        a[++tail] = a[head];
        head++;
    }
    getchar();
    getchar();
}

void test020102()
{
    struct queue {
        int data[100];
        int tail;
        int head;
    };

    struct queue q;
    int a[9] = {6, 3, 1, 7, 5, 8, 9, 2, 4};

    for (int i = 0; i < 9; i++) {
        q.data[i] = a[i];
    }
    q.head = 0;
    q.tail = 8;

    while (q.head <= q.tail) {
        printf("%d\t", q.data[q.head]);
        q.head++;
        q.tail++;
        q.data[q.tail] = q.data[q.head];
        q.head++;
    }

    getchar();
    getchar();

}


void test020201()
{
    char a[255];
    printf("请输入字符串\n");
    gets(a);

    int length = (int)strlen(a);
    int mid = length / 2;
    int top = -1;

    int temp[255];
    for (int i = 0; i < mid; i++) {
        temp[++top] = a[i];
    }

    int next = length % 2 ? mid+1 : mid;
    while (top > 0) {
        if (temp[top--] != a[next++]) break;
    }

    if (top == 0) {
        printf("YES");
    } else {
        printf("NO");
    }
    getchar();
}

void test020301()
{// 重点:当赢牌的时候勿忘将标记book里面的数据初始化
    /**
     *  啊哈算法里面结果不同
     */
    struct queque {
        int data[1024];
        int head;
        int tail;
        char *name;
    };

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

    struct queque q1, q2;
    q1.name = "小哼";
    q2.name = "小哈";
    q1.head = q1.tail = 0;
    q2.head = q2.tail = 0;

    // 初始化q1
    printf("请输入小哼的牌\n");
    for (int i = 0; i < 6; i++) {
        scanf("%d", &q1.data[q1.tail++]);
    }

    // 初始化q2
    printf("请输入小哈的牌\n");
    for (int i = 0; i < 6; i++) {
        scanf("%d", &q2.data[q2.tail++]);
    }


    struct stack a;
    a.top = 0;
    int book[10];

    // 初始化标记按钮
    for (int i = 0; i < 10; i++) {
        book[i] = 0;
    }

    while (q1.head < q1.tail && q2.head < q2.tail) {
        int num = 0;

        // 取q1手中的牌
        num = q1.data[q1.head++];
        if (book[num] == 1) {
            q1.data[q1.tail++] = num;
            while (a.top > 0) {
                q1.data[q1.tail++] = a.data[--a.top];
                book[a.data[a.top]] = 0;
                if (num == a.data[a.top]) break;
            }

        } else {
            a.data[a.top++] = num;
            book[num] = 1;
            if (q1.tail == q1.head) {
                printf("%swin\n", q2.name);
                for (; q2.head < q2.tail; q2.head++) {
                    printf("%d\t", q2.data[q2.head]);
                }
                break;
            }
        }


        num = q2.data[q2.head++];
        if (book[num] == 1) {
            q2.data[q2.tail++] = num;
            while (a.top > 0) {
                q2.data[q2.tail++] = a.data[--a.top];
                book[a.data[a.top]] = 0;
                if (num == a.data[a.top]) break;
            }
        } else {
            a.data[a.top++] = num;
            book[num] = 1;
            if (q2.tail == q2.head) {
                printf("%swin\n", q1.name);
                for (; q1.head < q1.tail; q1.head++) {
                    printf("%d\t", q1.data[q1.head]);
                }
                break;
            }

        }

    }

    printf("\n桌子上的纸牌\n");
    while (a.top > 0) {
        printf("%d\t", a.data[--a.top]);
    }

    getchar();
    getchar();
}

void test020401()
{
    struct Node {
        int data;
        struct Node *next;
    };

    struct Node *head = NULL, *p = NULL, *q = NULL;
    int n;

    printf("输入一个数n,表示接下来要输入n个数:\n");
    scanf("%d", &n);
    printf("请输入数:\n");

    for (int i = 0; i < n; i++) {
        p = (struct Node *)malloc(sizeof(struct Node));
        if (p == NULL) {
            printf("申请空间失败");
        } else {
            scanf("%d", &p->data);
            p->next = NULL;
        }

        if (head == NULL) {
            head = p;
            q = head;
        } else {
            q->next = p;
            q = p;
            p = NULL;
        }
    }

    p = head;
    while (p != NULL) {
        printf("%d\t", p->data);
        p = p->next;
    }

    getchar();
    getchar();

}

void test020402()
{
    struct Node {
        int data;
        struct Node *next;
    };

    struct Node *head = NULL, *p = NULL, *q = NULL;
    int n;

    printf("输入一个数n,表示接下来要输入n个数:\n");
    scanf("%d", &n);
    printf("请输入数:\n");

    for (int i = 0; i < n; i++) {
        p = (struct Node *)malloc(sizeof(struct Node));
        if (p == NULL) {
            printf("申请空间失败");
        } else {
            scanf("%d", &p->data);
            p->next = NULL;
        }

        if (head == NULL) {
            head = p;
            q = head;
        } else {
            q->next = p;
            q = p;
            p = NULL;
        }
    }

    printf("输入插入数据:\n");
    p = (struct Node *)malloc((sizeof(struct Node)));
    scanf("%d", &p->data);
    q = head;
    while (q != NULL) {
        if (q->next->data > p->data) {
            p->next = q->next;
            q->next = p;
            p = NULL;
            break;
        }
        q = q->next;
    }

    q = head;
    while (q != NULL) {
        printf("%d\t", q->data);
        q = q->next;
    }

    getchar();
    getchar();
}

int countHuoChai030301(int x)
{
    int f[] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6};
    int sum = 0;

    while (x / 10 >0) {
        sum += f[x % 10];
        x /= 10;
    }

    sum += f[x];

    return sum;
}

void test030301()
{
    int n;
    int sum = 0;


    printf("输入火柴数:\n");
    scanf("%d", &n);

    if (n > 24) {
        printf("火柴太多");
    } else if (n < 10) {
        printf("火柴太少,构不成式子");
    }

    for (int i = 0; i < 1111; i++) {
        for (int j = 0; j < 1111; j++) {
            sum = i + j;
            if (sum > 1111) break;

            if (countHuoChai030301(i) + countHuoChai030301(j) + countHuoChai030301(sum) == n - 4) {
                printf("%d + %d = %d\n", i, j, sum);
            }

        }
    }

    getchar();
    getchar();
}

void dtp040101(int *a,int *book,int step)
{
    if (step == 10) {
        if (a[1]*100+a[2]*10+a[3] + a[4]*100+a[5]*10+a[6] == a[7]*100+a[8]*10+a[9]) {
            printf("%d + %d = %d\n", a[1]*100+a[2]*10+a[3], a[4]*100+a[5]*10+a[6], a[7]*100+a[8]*10+a[9]);
        }
        return;
    }

    for (int i = 1; i < 10; i++) {
        if (book[i] == 0) {
            book[i] = 1;
            a[step] = i;
            dtp040101(a, book, step + 1);
            book[i] = 0;
        }
    }
}

void test040101()
{
    int a[10] = {0};
    int book[10] = {0};

    dtp040101(a, book, 1);

    getchar();
    getchar();

}

void dtp040201(int *a, int *book, int startX, int startY, int endX, int endY, int row, int col, int step)
{
    if (startX == endX && startY == endY) {
        printf("%d步成功\n", step);
        return;
    }

    int tempX = startX;
    int tempY = startY;

    for (int i = 0; i < 4; i++) {
        switch (i) {
            case 0:
                tempX = startX + 1;
                tempY = startY;
                break;
            case 1:
                tempX = startX;
                tempY = startY + 1;
                break;
            case 2:
                tempX = startX - 1;
                tempY = startY;
                break;
            case 3:
                tempX = startX;
                tempY = startY - 1;
                break;
            default:
                break;
        }

        if (tempX<0 || tempX>=row || tempY<0 || tempY>=col) {
            continue;
        }

        int aInt = *(a+tempX*50+tempY);
        int bookInt = *(book+tempX*50+tempY);

        if (aInt==0 && bookInt==0) {
            *(a+tempX*50+tempY) = 1;
            dtp040201(a, book, tempX, tempY, endX, endY, row, col, step+1);
            *(a+tempX*50+tempY) = 0;
        }
    }

}

void test040201()
{
    int i, j, endX, endY;
    int m, n;

    int a[50][50] = {0};
    int book[50][50] = {0};

    printf("初始化n行m列\n");
    scanf("%d %d", &n, &m);
    printf("初始化迷宫\n");
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
            scanf("%d", &a[i][j]);
        }
    }
    printf("读入小哈位置\n");
    scanf("%d %d", &endX, &endY);

    book[0][0] = 1;
    dtp040201((int *)a, (int *)book, 0, 0, endX, endY, n, m, 0);

    getchar();
    getchar();
}

void test040301()
{
    struct Point {
        int x;
        int y;
        int step;
        struct Point *next;
    };

    struct Queue {
        struct Point *head;
        struct Point *tail;
    };

    int i, j, endX, endY;
    int m, n;

    int a[50][50] = {0};
    int book[50][50] = {0};

    printf("初始化n行m列\n");
    scanf("%d %d", &n, &m);
    printf("初始化迷宫\n");
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
            scanf("%d", &a[i][j]);
        }
    }
    printf("读入小哈位置\n");
    scanf("%d %d", &endX, &endY);


    struct Point *p1 = (struct Point *)malloc(sizeof(struct Point));
    p1->x = 0;
    p1->y = 0;
    p1->step = 0;
    p1->next = NULL;

    struct Queue *queue = (struct Queue *)malloc(sizeof(struct Queue));
    queue->head = p1;
    queue->tail = p1;
    book[0][0] = 1;

    do {
        struct Point *p2;
        if (queue->head->next == NULL) {
            p2 = queue->head;
        } else {
            p2 = queue->head->next;
            free(queue->head);
            queue->head = p2;
        }


        for (int i = 0; i < 4; i++) {
            struct Point *p = (struct Point *)malloc(sizeof(struct Point));
            p->x = p2->x;
            p->y = p2->y;
            p->step = p2->step;

            switch (i) {
                case 0:
                    p->x += 1;
                    break;
                case 1:
                    p->y += 1;
                    break;
                case 2:
                    p->x -= 1;
                    break;
                case 3:
                    p->y -= 1;
                    break;
                default:
                    break;
            }

            if (p->x<0 || p->x>=n || p->y<0 || p->y>=m) {
                free(p);
                p = NULL;
                continue;
            }

            if (book[p->x][p->y]==0 && a[p->x][p->y]==0) {
                book[p->x][p->y] = 1;
                p->step++;
                if (p->x==endX && p->y==endY) {
                    printf("%d步", p->step);
                    break;
                }

                queue->tail->next = p;
                p->next = NULL;
                queue->tail = p;
            } else {
                free(p);
                p = NULL;
            }

        }

    } while (queue->head != queue->tail);


    free(queue);
    queue = NULL;
    free(p1);
    p1 = NULL;

    getchar();
    getchar();
}


struct Point040601 {
    int x[1024];
    int y[1024];
    int top;
} *p040601;

void dtp040601(int a[][50], int book[][50], int x, int y, int direction, int row, int col)
{
    if (x<1 || x>row || y<1 || y>col || book[x][y]==1 || a[x][y]==0) {
        return;
    }

    book[x][y] = 1;
    p040601->x[p040601->top] = x;
    p040601->y[p040601->top] = y;
    p040601->top++;

    if (x==row && y==col) {
        printf("成功\n");
        for (int i = 0; i<p040601->top; i++) {
            printf("(%d,%d)\t", p040601->x[i], p040601->y[i]);
        }
        printf("\n");
        return;
    }

    switch (direction) {
        case 0:
        {
            if (a[x][y] >=5) {
                dtp040601(a, book, x, y+1, 0, row, col);
            } else {
                dtp040601(a, book, x+1, y, 1, row, col);
                dtp040601(a, book, x-1, y, 3, row, col);
            }
            break;
        }

        case 1:
        {
            if (a[x][y] >=5) {
                dtp040601(a, book, x+1, y, 1, row, col);
            } else {
                dtp040601(a, book, x, y+1, 0, row, col);
                dtp040601(a, book, x, y-1, 2, row, col);
            }
            break;
        }

        case 2:
        {
            if (a[x][y] >=5) {
                dtp040601(a, book, x, y-1, 2, row, col);
            } else {
                dtp040601(a, book, x+1, y, 1, row, col);
                dtp040601(a, book, x-1, y, 3, row, col);
            }
            break;
        }

        case 3:
        {
            if (a[x][y] >=5) {
                dtp040601(a, book, x-1, y, 3, row, col);
            } else {
                dtp040601(a, book, x, y+1, 0, row, col);
                dtp040601(a, book, x, y-1, 2, row, col);
            }
            break;
        }

        default:
            break;
    }

    book[x][y] = 0;
    p040601->top--;
    p040601->x[p040601->top] = x;
    p040601->y[p040601->top] = y;

}

void test040601()
{
    int i, j;
    int m, n;

    int a[50][50] = {0};
    int book[50][50] = {0};

    p040601 = (struct Point040601 *)malloc(sizeof(struct Point040601));
    p040601->top = 0;

    printf("初始化n行m列\n");
    scanf("%d %d", &n, &m);
    printf("初始化水管\n");
    for (i = 1; i <= n; i++) {
        for (j = 1; j <= m; j++) {
            scanf("%d", &a[i][j]);
        }
    }

    dtp040601(a, book, 1, 1, 0, n, m);

    free(p040601);
    p040601 = NULL;
    getchar();
    getchar();

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值