• 《数据结构算法分析C描述》引论:选择问题,字谜游戏问题


    #include <stdio.h>
    #include <stdlib.h>
    // 第一题
    // 找出N个数的第k个最大者
    // 方法1:排序(冒泡),降序找出第k个值
    // 方法2:选前k个点进行降序排序,后面的数进行比较,
    // 如果数比第k个数小则忽略, 复杂度低于方法1
    #define TYPE int
    #define TESTBUBLESORT 1
    #define TESTBLOCKCOMPARE 1
    #define TESTWORDPUZZLE 1
    int findk_bublesort(TYPE *pData, int N, int k);
    int findk_blockcompare(TYPE *pData, int N, int k); // 缺点修改了原数据
    // 第二题
    // wordpuzzle猜字谜游戏,在三个方向上找单词
    // dirction = 0 水平方向 从左至右
    // dirction = 1............右..左
    // ...........2............上..下
    // ...........3............下..上
    // ...........4............正对角线->
    // ...........5....................<-
    // ...........6............负对角线<-
    // ...........7....................->
    // pData字谜
    // pattern:欲猜的单词
    int wordpuzzle(char *pData, char *pattern, int row, int col, int driction);
    int my_strlen(char *s); // 获取字符串的长度
    void my_strcat(char *s, char *t); // 连接字符串
    void my_strcpy(char *s, char *t); // 复制字符串
    
    // Test Model
    int main()
    {
        printf("Hello world!
    ");
    
        int N = 10000;
        int k = N / 2;
        TYPE *pTestData = (TYPE *)malloc(sizeof(TYPE) * N);
        int i;
        for (i = 0; i < N; ++i)
            pTestData[i] = i;
    #ifdef TESTBUBLESORT
    //    printf("the k = %d in N is %d
    ", k, findk_bublesort(pTestData, N, k));
    #endif
    #ifdef TESTBLOCKCOMPARE
        printf("the k = %d in N is %d
    ", k, findk_blockcompare(pTestData, N, k));
    #endif
     //   for (i = 0; i < N; ++i)
     //       printf("%d  ", pTestData[i]);
     //   printf("
    ");
        free(pTestData);
    
    #ifdef TESTWORDPUZZLE
        int row = 4;
        int col = 4;
        char *WorldModle = (char *)malloc(sizeof(char) * row * col);
        char *a1 = "this";
        char *a2 = "wats";
        char *a3 = "oahg";
        char *a4 = "fght";
        my_strcpy(WorldModle, a1);
        my_strcat(WorldModle, a2);
        my_strcat(WorldModle, a3);
        my_strcat(WorldModle, a4);
        char *pattern = "that";
        int np = my_strlen(pattern);
    
        if (np > row || np > col)
        {
           fputs("the pattern size is bigger!", stderr);
           return -1;
        }
        for (i = 0; i < 8; ++i)
        {
            if (wordpuzzle(WorldModle, pattern, row, col, i))
            {
                printf("find word:[%s] at dirction [%d] of wordwidget
    ", pattern, i);
                break;
            }
        }
    #endif
        return 0;
    }
    
    void my_strcpy(char *s, char *t)
    {
        while (*s++ = *t++)
            ;
    }
    void my_strcat(char *s, char *t)
    {
        while(*s)
        {
            ++s;
        }
        my_strcpy(s, t);
    }
    
    int findk_bublesort(TYPE *pData, int N, int k)
    {
        // 对数据进行冒泡排序 降序
        int i, j;
        for (i = 0; i < N; ++i)
        {
            for (j = i + 1; j < N; ++j)
            {
                if (pData[i] < pData[j])
                {
                    TYPE temp;
                    temp = pData[i];
                    pData[i] = pData[j];
                    pData[j] = temp;
                }
            }
        }
        return pData[k - 1];
    }
    
    int findk_blockcompare(TYPE *pData, int N, int k)
    {
        // 先读入前k个数进行降序排列,然后与后面的数比较
        // 前k个数进行降序排列
        int i, j, z;
        for (i = 0; i < k; ++i)
        {
            for (j = i + 1; j < k; ++j)
            {
                if (pData[i] < pData[j])
                {
                    TYPE temp;
                    temp = pData[i];
                    pData[i] = pData[j];
                    pData[j] = temp;
                }
            }
        }
        // 与后面的数与前k个数进行比较
        for (i = k; i < N; ++i)
        {
            for (j = 0; j < k; ++j)
            {
                if (pData[j] <= pData[i])
                {
                    // 大于k个数中的一个 插入新元素
                    for (z = k - 2; z >= j; --z)
                        pData[z + 1] = pData[z]; // 右移元素
                    pData[j] = pData[i];         // 插入新元素
                    break;
                }
            }
        }
        return pData[k - 1];
    }
    
    int wordpuzzle(char *pData, char *pattern, int row, int col, int driction)
    {
        int result = 0;
        int i, j;
    
        int np;
    
        int k = 0;
        switch (driction)
        {
            case 0: // 从水平方向从左至右找
                for (i = 0; i < row; ++i)
                {
                    for (j = 0; j < col; ++j)
                    {
                        if (pData[i * col + j] == pattern[k])
                        {
                            k++;
                        }
                        if (pattern[k] == '')
                            result = 1;
                    }
                    k = 0;
                }
    
            break;
    
            case 1: // 从水平方向上从右至左找
                for (i = 0; i < row; ++i)
                {
                    for (j = col - 1; j >= 0; --j, --np)
                    {
                        if (pData[i * col + j] == pattern[k])
                        {
                            k++;
                        }
                        if (pattern[k] == '')
                            result = 1;
                    }
                    k = 0;
                }
            break;
    
            case 2: // 按列从上往下找
                for (i = 0; i < col; ++i)
                {
                    for (j = 0; j < row; ++j)
                    {
                        if (pData[j * row + i] == pattern[k])
                        {
                            k++;
                        }
                        if (pattern[k] == '')
                            result = 1;
                    }
                    k = 0;
                }
            break;
    
            case 3: // 按列从下往上找
                for (i = 0; i < col; ++i)
                {
                    for (j = row - 1; j >= 0; --j)
                    {
                        if (pData[j * row + i] == pattern[k])
                        {
                            k++;
                        }
                        if (pattern[k] == '')
                            result = 1;
                    }
                    k = 0;
                }
            break;
    
            case 4: // 按正对角线从左到右
                for (i = 0; i < row; ++i)
                {
                    for (j = 0; j < col; ++j)
                    {
                        if (i == j)
                        {
                            if (pData[i * row + j] == pattern[k])
                            {
                                k++;
                            }
                            if (pattern[k] == '')
                                result = 1;
                        }
                    }
                }
                k = 0;
            break;
    
            case 5: // 按正对角线从右到左
                for (i = row - 1; i >= 0; --i)
                {
                    for (j = col - 1; j >= 0; --j)
                    {
                        if (i == j)
                        {
                            if (pData[i * row + j] == pattern[k])
                            {
                                k++;
                            }
                            if (pattern[k] == '')
                                result = 1;
                        }
                    }
                }
                k = 0;
            break;
    
            case 6: // 按负对角线从右到左
                for (i = col - 1; i >= 0; --i)
                {
                    for (j = 0; j < row ; --j)
                    {
                        if (i + j == col - 1)
                        {
                            if (pData[i * row + j] == pattern[k])
                            {
                                k++;
                            }
                            if (pattern[k] == '')
                                result = 1;
                        }
                    }
                }
                k = 0;
            break;
    
            case 7: // 从负对角线从左到右
                for (i = row - 1; i >= 0; --i)
                {
                    for (j = 0; j < col; ++j)
                    {
                        if (i + j == row - 1)
                        {
                            if (pData[i * row + j] == pattern[k])
                            {
                                k++;
                            }
                            if (pattern[k] == '')
                                result = 1;
                        }
                    }
                }
            k = 0;
            break;
            default:
            break;
        }
        return result;
    }
    
    int my_strlen(char *s)
    {
        int n = 0;
        while (*s++)
            ++n;
        return n;
    }
  • 相关阅读:
    中间件(1)分布式缓存
    大型网站架构演进(9)服务化
    大型网站架构演进(8)业务拆分
    大型网站架构演进(7)数据库拆分
    大型网站架构演进(6)使用NoSQL和搜索引擎
    大型网站架构演进(5)数据库读写分离
    大型网站架构演进(4)使用应用服务器集群
    大型网站架构演进(3)使用缓存改善网站性能
    大型网站架构演进(2)数据库与应用服务器分离
    大型网站架构演进(1)单机网站
  • 原文地址:https://www.cnblogs.com/wuchanming/p/3789909.html
Copyright © 2020-2023  润新知