• 【竞赛题目】木块(C语言详解)


    " 木块 "【第二届全国高校计算机技能竞赛】里的一道竞赛题目,博主觉得很新颖想推荐给大家;

    题目描述

    为了提高词汇量,小理得到了一套四块木块,其中每块都是一个立方体六面各写着一个字母。他正在通过将木块排成一排使得木块顶部的字母拼出单词来学习拼写。

    给定小理的四个木块上的字母,以及他想拼写的单词列表,请确定列表中哪些单词可被他使用木块成功拼写

    输入

    输入共 N+5 行。

    输入的第一行包含 N,为小理想要拼写的单词数。

    接下来的 四行 每行包含一个带有六个大写字母的字符串,表示小理的一个块的六个侧面上的字母。

    接下来的 行包含小理想要拼写的 N 个单词。其中每一个的长度在 1 到 4 个大写字母之间。

    输出

    对于小理列表中的每个单词,如果他能够使用木块拼写,则输出 YES ,否则输出 NO

    样式输入:

    6
    MOOOOO
    OOOOOO
    ABCDEF
    UVWXYZ
    COW
    MOO
    ZOO
    MOVE
    CODE
    FARM

    样式输出:

    YES
    NO
    YES
    YES
    NO
    NO

    提示:

    对于 100% 的数据,保证 1 <= N <= 10

    在本例中,小理可以拼写 "COW"、"ZOO"和"MOVE"。不幸的是,他不能拼写 "MOO",因为唯一带有字母 "M" 的木块也不能用于 "MOO"。他不能拼写 "FARM",因为没有字母 " R " 的木块。他不能拼写 "CODE",因为 "C""E""D"都属于同一个木块。

    题目就是这样,刚看完的小伙伴会有点绕,题目的意思呢就是让 我们写单词让四个有六个面的木块
    组,然后在判断能不能组成功就OK了

    思路解析:

    我们有 四个木块每块有六个字母,我们写 n 单词判断能不能用木块组成功;
    我们可以先将单词存再一个数组里面,然后让木块去消灭它,这听起来有点抽象;
    首先 单词并不好存,但是我们可以把 字母化成数字去进行存储,存储成功就让数组内的值 ++ ,然 后让木块去消灭,木块里的单词对应数组里的值让其 - - ,最后在 判断数组里的值看看有没有消灭干净

    思路实现:

    1. int main()
    2. {
    3. int n = 0;
    4. scanf("%d", &n); //要写的单词个数
    5. char block[4][7] = { 0 };
    6. int i = 0;
    7. for (i = 0; i < 4; i++)
    8. {
    9. scanf("%s", &block[i]); //输入木块
    10. }
    11. char word[10][5] = { 0 };
    12. for (i = 0; i < n; i++)
    13. {
    14. scanf("%s", &word[i]); //输入单词
    15. }
    16. printf("\n");
    17. for (i = 0; i < n; i++)
    18. {
    19. if (search(block, word[i])) //检索
    20. {
    21. printf("YES\n");
    22. }
    23. else
    24. {
    25. printf("NO\n");
    26. }
    27. }
    28. return 0;
    29. }

    这是主函数框架,我们先给木块,单词赋值,然后再加以判断,如果函数返回 非0 就打印 YES ,反之打印 NO;

    然后我们要实现 检索函数 search;
    1. int search(char block[4][7], char word[5])
    2. {
    3. int count[26] = { 0 };
    4. int i = 0;
    5. int len = strlen(word);
    6. for (i = 0; i < len; i++)
    7. {
    8. count[word[i] - 'A']++; //存进单词
    9. }
    10. int j = 0;
    11. for (i = 0; i < 4; i++)
    12. {
    13. for (j = 0; j < 6; j++)
    14. {
    15. count[block[i][j] - 'A']--; //消灭单词--每行只能消灭一个
    16. if (count[block[i][j] - 'A'] >= 0)
    17. {
    18. break;
    19. }
    20. }
    21. }
    22. for (i = 0; i < 26; i++) //遍历数组看看有没有消灭干净
    23. {
    24. if (count[i] > 0)
    25. {
    26. return 0;
    27. }
    28. }
    29. return 1;
    30. }

    我们定义 count 数组来表示存储单词,我们将字母减去 ' A ',即可变为相应的数字,我们先将字母存进去,将对应的下标对应的值 ++,然后再让木块去数组里面消灭每个木块最多只能消灭一个(因为是四个木块组成单词,所以一个木块只能提供一个单词),让木块里的字母对应的下标里的值 — —,然后再检查 count 数组里的值,如果出现大于0的值就说明没消灭干净也就是木块组成不了返回 0 ,反之返回 1

    我们用用例试一下:
    可以看到也是没有任何问题的;
    这个题目我觉得挺新颖的,大家可以看一下,学习一下;

    源代码:

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include
    3. #include
    4. int search(char block[4][7], char word[5])
    5. {
    6. int count[26] = { 0 };
    7. int i = 0;
    8. int len = strlen(word);
    9. for (i = 0; i < len; i++)
    10. {
    11. count[word[i] - 'A']++; //存进单词
    12. }
    13. int j = 0;
    14. for (i = 0; i < 4; i++)
    15. {
    16. for (j = 0; j < 6; j++)
    17. {
    18. count[block[i][j] - 'A']--; //消灭单词--每行只能消灭一个
    19. if (count[block[i][j] - 'A'] >= 0)
    20. {
    21. break;
    22. }
    23. }
    24. }
    25. for (i = 0; i < 26; i++) //遍历数组看看有没有消灭干净
    26. {
    27. if (count[i] > 0)
    28. {
    29. return 0;
    30. }
    31. }
    32. return 1;
    33. }
    34. int main()
    35. {
    36. int n = 0;
    37. scanf("%d", &n); //要写的单词个数
    38. char block[4][7] = { 0 };
    39. int i = 0;
    40. for (i = 0; i < 4; i++)
    41. {
    42. scanf("%s", &block[i]); //输入木块
    43. }
    44. char word[10][5] = { 0 };
    45. for (i = 0; i < n; i++)
    46. {
    47. scanf("%s", &word[i]); //输入单词
    48. }
    49. printf("\n");
    50. for (i = 0; i < n; i++)
    51. {
    52. if (search(block, word[i])) //检索
    53. {
    54. printf("YES\n");
    55. }
    56. else
    57. {
    58. printf("NO\n");
    59. }
    60. }
    61. return 0;
    62. }

  • 相关阅读:
    【Pygame实战】再次祭出舍不得分享的学习小技巧,用游戏玩出英文能力(O基础也能轻松get)
    从制造到“智造”,看科聪控制系统如何赋能汽车行业智能生产
    千年TGS服务器日志报错如何解决
    古籍数字化平台中的OCR:这个平台更精准
    VS 常用的快捷键指令
    携职教育:2022年初级会计成绩查询倒计时,这几件事一定要注意
    机器学习基础了解
    数据结构之单链表的模拟实现
    同步和异步
    应用链的崛起将带来哪些风险与机遇?
  • 原文地址:https://blog.csdn.net/m0_71676870/article/details/133761723