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

[cpp] 
view plain
copy
print
?

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. // 第一题  
  4. // 找出N个数的第k个最大者  
  5. // 方法1:排序(冒泡),降序找出第k个值  
  6. // 方法2:选前k个点进行降序排序,后面的数进行比较,  
  7. // 如果数比第k个数小则忽略, 复杂度低于方法1  
  8. #define TYPE int  
  9. #define TESTBUBLESORT 1  
  10. #define TESTBLOCKCOMPARE 1  
  11. #define TESTWORDPUZZLE 1  
  12. int findk_bublesort(TYPE *pData, int N, int k);  
  13. int findk_blockcompare(TYPE *pData, int N, int k); // 缺点修改了原数据  
  14. // 第二题  
  15. // wordpuzzle猜字谜游戏,在三个方向上找单词  
  16. // dirction = 0 水平方向 从左至右  
  17. // dirction = 1…………右..左  
  18. // ………..2…………上..下  
  19. // ………..3…………下..上  
  20. // ………..4…………正对角线->  
  21. // ………..5………………..<-  
  22. // ………..6…………负对角线<-  
  23. // ………..7………………..->  
  24. // pData字谜  
  25. // pattern:欲猜的单词  
  26. int wordpuzzle(char *pData, char *pattern, int row, int col, int driction);  
  27. int my_strlen(char *s); // 获取字符串的长度  
  28. void my_strcat(char *s, char *t); // 连接字符串  
  29. void my_strcpy(char *s, char *t); // 复制字符串  
  30.   
  31. // Test Model  
  32. int main()  
  33. {  
  34.     printf(“Hello world!\n”);  
  35.   
  36.     int N = 10000;  
  37.     int k = N / 2;  
  38.     TYPE *pTestData = (TYPE *)malloc(sizeof(TYPE) * N);  
  39.     int i;  
  40.     for (i = 0; i < N; ++i)  
  41.         pTestData[i] = i;  
  42. #ifdef TESTBUBLESORT  
  43. //    printf(“the k = %d in N is %d\n”, k, findk_bublesort(pTestData, N, k));  
  44. #endif  
  45. #ifdef TESTBLOCKCOMPARE  
  46.     printf(“the k = %d in N is %d\n”, k, findk_blockcompare(pTestData, N, k));  
  47. #endif  
  48.  //   for (i = 0; i < N; ++i)  
  49.  //       printf(“%d  “, pTestData[i]);  
  50.  //   printf(“\n”);  
  51.     free(pTestData);  
  52.   
  53. #ifdef TESTWORDPUZZLE  
  54.     int row = 4;  
  55.     int col = 4;  
  56.     char *WorldModle = (char *)malloc(sizeof(char) * row * col);  
  57.     char *a1 = “this”;  
  58.     char *a2 = “wats”;  
  59.     char *a3 = “oahg”;  
  60.     char *a4 = “fght”;  
  61.     my_strcpy(WorldModle, a1);  
  62.     my_strcat(WorldModle, a2);  
  63.     my_strcat(WorldModle, a3);  
  64.     my_strcat(WorldModle, a4);  
  65.     char *pattern = “that”;  
  66.     int np = my_strlen(pattern);  
  67.   
  68.     if (np > row || np > col)  
  69.     {  
  70.        fputs(“the pattern size is bigger!”, stderr);  
  71.        return -1;  
  72.     }  
  73.     for (i = 0; i < 8; ++i)  
  74.     {  
  75.         if (wordpuzzle(WorldModle, pattern, row, col, i))  
  76.         {  
  77.             printf(“find word:[%s] at dirction [%d] of wordwidget\n”, pattern, i);  
  78.             break;  
  79.         }  
  80.     }  
  81. #endif  
  82.     return 0;  
  83. }  
  84.   
  85. void my_strcpy(char *s, char *t)  
  86. {  
  87.     while (*s++ = *t++)  
  88.         ;  
  89. }  
  90. void my_strcat(char *s, char *t)  
  91. {  
  92.     while(*s)  
  93.     {  
  94.         ++s;  
  95.     }  
  96.     my_strcpy(s, t);  
  97. }  
  98.   
  99. int findk_bublesort(TYPE *pData, int N, int k)  
  100. {  
  101.     // 对数据进行冒泡排序 降序  
  102.     int i, j;  
  103.     for (i = 0; i < N; ++i)  
  104.     {  
  105.         for (j = i + 1; j < N; ++j)  
  106.         {  
  107.             if (pData[i] < pData[j])  
  108.             {  
  109.                 TYPE temp;  
  110.                 temp = pData[i];  
  111.                 pData[i] = pData[j];  
  112.                 pData[j] = temp;  
  113.             }  
  114.         }  
  115.     }  
  116.     return pData[k – 1];  
  117. }  
  118.   
  119. int findk_blockcompare(TYPE *pData, int N, int k)  
  120. {  
  121.     // 先读入前k个数进行降序排列,然后与后面的数比较  
  122.     // 前k个数进行降序排列  
  123.     int i, j, z;  
  124.     for (i = 0; i < k; ++i)  
  125.     {  
  126.         for (j = i + 1; j < k; ++j)  
  127.         {  
  128.             if (pData[i] < pData[j])  
  129.             {  
  130.                 TYPE temp;  
  131.                 temp = pData[i];  
  132.                 pData[i] = pData[j];  
  133.                 pData[j] = temp;  
  134.             }  
  135.         }  
  136.     }  
  137.     // 与后面的数与前k个数进行比较  
  138.     for (i = k; i < N; ++i)  
  139.     {  
  140.         for (j = 0; j < k; ++j)  
  141.         {  
  142.             if (pData[j] <= pData[i])  
  143.             {  
  144.                 // 大于k个数中的一个 插入新元素  
  145.                 for (z = k – 2; z >= j; –z)  
  146.                     pData[z + 1] = pData[z]; // 右移元素  
  147.                 pData[j] = pData[i];         // 插入新元素  
  148.                 break;  
  149.             }  
  150.         }  
  151.     }  
  152.     return pData[k – 1];  
  153. }  
  154.   
  155. int wordpuzzle(char *pData, char *pattern, int row, int col, int driction)  
  156. {  
  157.     int result = 0;  
  158.     int i, j;  
  159.   
  160.     int np;  
  161.   
  162.     int k = 0;  
  163.     switch (driction)  
  164.     {  
  165.         case 0: // 从水平方向从左至右找  
  166.             for (i = 0; i < row; ++i)  
  167.             {  
  168.                 for (j = 0; j < col; ++j)  
  169.                 {  
  170.                     if (pData[i * col + j] == pattern[k])  
  171.                     {  
  172.                         k++;  
  173.                     }  
  174.                     if (pattern[k] == ‘\0’)  
  175.                         result = 1;  
  176.                 }  
  177.                 k = 0;  
  178.             }  
  179.   
  180.         break;  
  181.   
  182.         case 1: // 从水平方向上从右至左找  
  183.             for (i = 0; i < row; ++i)  
  184.             {  
  185.                 for (j = col – 1; j >= 0; –j, –np)  
  186.                 {  
  187.                     if (pData[i * col + j] == pattern[k])  
  188.                     {  
  189.                         k++;  
  190.                     }  
  191.                     if (pattern[k] == ‘\0’)  
  192.                         result = 1;  
  193.                 }  
  194.                 k = 0;  
  195.             }  
  196.         break;  
  197.   
  198.         case 2: // 按列从上往下找  
  199.             for (i = 0; i < col; ++i)  
  200.             {  
  201.                 for (j = 0; j < row; ++j)  
  202.                 {  
  203.                     if (pData[j * row + i] == pattern[k])  
  204.                     {  
  205.                         k++;  
  206.                     }  
  207.                     if (pattern[k] == ‘\0’)  
  208.                         result = 1;  
  209.                 }  
  210.                 k = 0;  
  211.             }  
  212.         break;  
  213.   
  214.         case 3: // 按列从下往上找  
  215.             for (i = 0; i < col; ++i)  
  216.             {  
  217.                 for (j = row – 1; j >= 0; –j)  
  218.                 {  
  219.                     if (pData[i * row + j] == pattern[k])  
  220.                     {  
  221.                         k++;  
  222.                     }  
  223.                     if (pattern[k] == ‘\0’)  
  224.                         result = 1;  
  225.                 }  
  226.                 k = 0;  
  227.             }  
  228.         break;  
  229.   
  230.         case 4: // 按正对角线从左到右  
  231.             for (i = 0; i < row; ++i)  
  232.             {  
  233.                 for (j = 0; j < col; ++j)  
  234.                 {  
  235.                     if (i == j)  
  236.                     {  
  237.                         if (pData[i * row + j] == pattern[k])  
  238.                         {  
  239.                             k++;  
  240.                         }  
  241.                         if (pattern[k] == ‘\0’)  
  242.                             result = 1;  
  243.                     }  
  244.                 }  
  245.             }  
  246.             k = 0;  
  247.         break;  
  248.   
  249.         case 5: // 按正对角线从右到左  
  250.             for (i = row – 1; i >= 0; –i)  
  251.             {  
  252.                 for (j = col – 1; j >= 0; –j)  
  253.                 {  
  254.                     if (i == j)  
  255.                     {  
  256.                         if (pData[i * row + j] == pattern[k])  
  257.                         {  
  258.                             k++;  
  259.                         }  
  260.                         if (pattern[k] == ‘\0’)  
  261.                             result = 1;  
  262.                     }  
  263.                 }  
  264.             }  
  265.             k = 0;  
  266.         break;  
  267.   
  268.         case 6: // 按负对角线从右到左  
  269.             for (i = col – 1; i >= 0; –i)  
  270.             {  
  271.                 for (j = 0; j < row ; –j)  
  272.                 {  
  273.                     if (i + j == col – 1)  
  274.                     {  
  275.                         if (pData[i * row + j] == pattern[k])  
  276.                         {  
  277.                             k++;  
  278.                         }  
  279.                         if (pattern[k] == ‘\0’)  
  280.                             result = 1;  
  281.                     }  
  282.                 }  
  283.             }  
  284.             k = 0;  
  285.         break;  
  286.   
  287.         case 7: // 从负对角线从左到右  
  288.             for (i = row – 1; i >= 0; –i)  
  289.             {  
  290.                 for (j = 0; j < col; ++j)  
  291.                 {  
  292.                     if (i + j == row – 1)  
  293.                     {  
  294.                         if (pData[i * row + j] == pattern[k])  
  295.                         {  
  296.                             k++;  
  297.                         }  
  298.                         if (pattern[k] == ‘\0’)  
  299.                             result = 1;  
  300.                     }  
  301.                 }  
  302.             }  
  303.         k = 0;  
  304.         break;  
  305.         default:  
  306.         break;  
  307.     }  
  308.     return result;  
  309. }  
  310.   
  311. int my_strlen(char *s)  
  312. {  
  313.     int n = 0;  
  314.     while (*s++)  
  315.         ++n;  
  316.     return n;  
  317. }  
    原文作者:Z字形编排问题
    原文地址: https://blog.csdn.net/u010944926/article/details/18224507
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞