" 木块 " 是【第二届全国高校计算机技能竞赛】里的一道竞赛题目,博主觉得很新颖想推荐给大家;
题目描述
为了提高词汇量,小理得到了一套四块木块,其中每块都是一个立方体,六面各写着一个字母。他正在通过将木块排成一排使得木块顶部的字母拼出单词来学习拼写。
给定小理的四个木块上的字母,以及他想拼写的单词列表,请确定列表中哪些单词可被他使用木块成功拼写
输入
输入共 N+5 行。
输入的第一行包含 N,为小理想要拼写的单词数。
接下来的 四行 每行包含一个带有六个大写字母的字符串,表示小理的一个块的六个侧面上的字母。
接下来的 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 个 单词判断能不能用木块组成功;
我们可以先将单词存再一个数组里面,然后让木块去消灭它,这听起来有点抽象;
首先 单词并不好存,但是我们可以把 字母化成数字去进行存储,存储成功就让数组内的值 ++ ,然 后让木块去消灭,木块里的单词对应数组里的值让其 - -,最后在 判断数组里的值看看有没有消灭干净;
思路实现:
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; }