
" 木块 " 是【第二届全国高校计算机技能竞赛】里的一道竞赛题目,博主觉得很新颖想推荐给大家;
为了提高词汇量,小理得到了一套四块木块,其中每块都是一个立方体,六面各写着一个字母。他正在通过将木块排成一排使得木块顶部的字母拼出单词来学习拼写。
给定小理的四个木块上的字母,以及他想拼写的单词列表,请确定列表中哪些单词可被他使用木块成功拼写
输入共 N+5 行。
输入的第一行包含 N,为小理想要拼写的单词数。
接下来的 四行 每行包含一个带有六个大写字母的字符串,表示小理的一个块的六个侧面上的字母。
接下来的 N 行包含小理想要拼写的 N 个单词。其中每一个的长度在 1 到 4 个大写字母之间。
对于小理列表中的每个单词,如果他能够使用木块拼写,则输出 YES ,否则输出 NO 。
对于 100% 的数据,保证 1 <= N <= 10。
在本例中,小理可以拼写 "COW"、"ZOO"和"MOVE"。不幸的是,他不能拼写 "MOO",因为唯一带有字母 "M" 的木块也不能用于 "MOO"。他不能拼写 "FARM",因为没有字母 " R " 的木块。他不能拼写 "CODE",因为 "C"、"E"和"D"都属于同一个木块。
- 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;
- 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
- #include
-
- 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;
- }
