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

简介: 【竞赛题目】木块(C语言详解)

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

题目描述

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

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

输入

输入共 N+5 行。

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

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

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

输出

对于小理列表中的每个单词,如果他能够使用木块拼写,则输出 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 判断能不能用木块组成功;

我们可以先将单词存再一个数组里面,然后让木块去消灭它,这听起来有点抽象;

首先 单词并不好存,但是我们可以把 字母化成数字去进行存储,存储成功就让数组内的值 ++ ,然 后让木块去消灭,木块里的单词对应数组里的值让其 - -,最后在 判断数组里的值看看有没有消灭干净

思路实现:

int main()
{
  int n = 0;
  scanf("%d", &n);  //要写的单词个数
  char block[4][7] = { 0 };
  int i = 0;
  for (i = 0; i < 4; i++)
  {
    scanf("%s", &block[i]);  //输入木块
  }
  char word[10][5] = { 0 };
  for (i = 0; i < n; i++)
  {
    scanf("%s", &word[i]);    //输入单词
  }
  printf("\n");
  for (i = 0; i < n; i++)
  {
    if (search(block, word[i]))  //检索
    {
      printf("YES\n");
    }
    else
    {
      printf("NO\n");
    }
  }
  return 0;
}

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

然后我们要实现 检索函数 search;

int search(char block[4][7], char word[5])
{
  int count[26] = { 0 };
  int i = 0;
  int len = strlen(word);
  for (i = 0; i < len; i++)
  {
    count[word[i] - 'A']++;  //存进单词
  }
  int j = 0;
  for (i = 0; i < 4; i++)
  {
    for (j = 0; j < 6; j++)
    {
      count[block[i][j] - 'A']--;   //消灭单词--每行只能消灭一个
      if (count[block[i][j] - 'A'] >= 0)
      {
        break;
      }
    }
  }
  for (i = 0; i < 26; i++)  //遍历数组看看有没有消灭干净
  {
    if (count[i] > 0)
    {
      return 0;
    }
  }
  return 1;
}

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

我们用用例试一下:

可以看到也是没有任何问题的;

这个题目我觉得挺新颖的,大家可以看一下,学习一下;

源代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int search(char block[4][7], char word[5])
{
  int count[26] = { 0 };
  int i = 0;
  int len = strlen(word);
  for (i = 0; i < len; i++)
  {
    count[word[i] - 'A']++;  //存进单词
  }
  int j = 0;
  for (i = 0; i < 4; i++)
  {
    for (j = 0; j < 6; j++)
    {
      count[block[i][j] - 'A']--;   //消灭单词--每行只能消灭一个
      if (count[block[i][j] - 'A'] >= 0)
      {
        break;
      }
    }
  }
  for (i = 0; i < 26; i++)  //遍历数组看看有没有消灭干净
  {
    if (count[i] > 0)
    {
      return 0;
    }
  }
  return 1;
}
int main()
{
  int n = 0;
  scanf("%d", &n);  //要写的单词个数
  char block[4][7] = { 0 };
  int i = 0;
  for (i = 0; i < 4; i++)
  {
    scanf("%s", &block[i]);  //输入木块
  }
  char word[10][5] = { 0 };
  for (i = 0; i < n; i++)
  {
    scanf("%s", &word[i]);    //输入单词
  }
  printf("\n");
  for (i = 0; i < n; i++)
  {
    if (search(block, word[i]))  //检索
    {
      printf("YES\n");
    }
    else
    {
      printf("NO\n");
    }
  }
  return 0;
}
目录
相关文章
|
1月前
|
程序员 C语言
【C语言】LeetCode(力扣)上经典题目
【C语言】LeetCode(力扣)上经典题目
|
3月前
|
存储 编译器 C语言
【C语言】指针练习题目
【C语言】指针练习题目
|
5月前
|
测试技术 C语言
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
46 1
|
5月前
|
C语言
1059 C语言竞赛 (20 分)
1059 C语言竞赛 (20 分)
|
6月前
|
算法 编译器 API
C语言易混淆、简单算法、结构体题目练习、常见关键字总结-1
C语言易混淆、简单算法、结构体题目练习、常见关键字总结
|
5月前
|
C语言
c语言循环题目
c语言循环题目
|
6月前
|
C语言
PTA 浙大版《C语言程序设计(第3版)》题目集 习题8-4 报数 (20分)
PTA 浙大版《C语言程序设计(第3版)》题目集 习题8-4 报数 (20分)
|
6月前
|
C语言
C语言 浙大版《C语言程序设计(第3版)》题目集 练习8-8 移动字母 (10分)
C语言 浙大版《C语言程序设计(第3版)》题目集 练习8-8 移动字母 (10分)
|
6月前
|
C语言
浙大版《C语言程序设计(第3版)》题目集 练习8-2 计算两数的和与差 (10分)
浙大版《C语言程序设计(第3版)》题目集 练习8-2 计算两数的和与差 (10分)
|
6月前
|
算法 C语言
C语言易混淆、简单算法、结构体题目练习、常见关键字总结-2
C语言易混淆、简单算法、结构体题目练习、常见关键字总结