Letter Game
2013-11-22 20:49
204 查看
题意:不想写,摘抄NOCOW翻译(http://www.nocow.cn/index.php/Translate:USACO/lgame)
在家里用电视机做字母游戏是很流行的,其中一种玩法是:每一个字母有一个数值与之对应.你收集字母组成一个或多个词以得到尽可能高的得分.除非你已有了 “找词的方法”(“a way with words”),你会把你知道的字都试一遍.有时你也许会查阅其拼写,然后计算得分。显然可以用计算机更为准确地完成此任务。上图示出了英文字母及其所对应的值,当给出英文单词(word) 的表列及收集的字母时,请找出所能形成的得分最高的词或词对(pairs of words)。
PROGRAM NAME: lgame
INPUT FORMAT:
(file lgame.in)
输入文件lgame.in中有一行由小写字母(`a'到`z')组成的字符串, 这就是收集到字母(就是可以使用的字母),字符串由至少3个字母至多7个字母(以任意顺序) 组成。
(file lgame.dict)
词典文件lgame.dict由至多40,000行组成,文件的最后一行有'.' 表示文件的结束。其它各行每一行都是由至少3个小写字母,至多7 个小写字母组成的字符串。文件中的词已按字典顺序排序。
OUTPUT FORMAT:
(file lgame.out)
在文件lgame.out的第一行,你的程序应写上最高得分(子任务A).使用上面图形中给出的字母-值对应表。
随后的每一行是由文件lgame.dict中查到的具有这个得分的所有的词和或词对(word pairs)(子任务B)。要利用图中给定的字母的值。
当两个词能够形成 一个组合(具有给定的字母)时,这两个词应该打印到同一行,两个词中间用一个空格隔开。不许重复表示词对,例如'rag prom'和'prom rag'是同样的词对,只输出字典顺序较小的那个。
输出要按照字典顺序排序,如果两个词对第一个单词的顺序相同,则按照第二个单词。一个词对中的两个单词可以相同。
解题思路:
读字典文件,将满足条件(每种字母的个数不超过输入序列中每个字母个数)的单词保存下来,存与diction中,diction_num保存diction的条数
对单个单词,顺序列举一遍diction就能进行处理
对两个单词,用两层循环来列举diction中选取两个单词的所有可能(i = [0, diction_num),j = [i, diction_num))
在列举过程中更新最高得分,并且存储相应的单词和词组,最后得到的结果输出即可
代码:
描述
在家里用电视机做字母游戏是很流行的,其中一种玩法是:每一个字母有一个数值与之对应.你收集字母组成一个或多个词以得到尽可能高的得分.除非你已有了 “找词的方法”(“a way with words”),你会把你知道的字都试一遍.有时你也许会查阅其拼写,然后计算得分。显然可以用计算机更为准确地完成此任务。上图示出了英文字母及其所对应的值,当给出英文单词(word) 的表列及收集的字母时,请找出所能形成的得分最高的词或词对(pairs of words)。
[编辑]格式
PROGRAM NAME: lgameINPUT FORMAT:
(file lgame.in)
输入文件lgame.in中有一行由小写字母(`a'到`z')组成的字符串, 这就是收集到字母(就是可以使用的字母),字符串由至少3个字母至多7个字母(以任意顺序) 组成。
(file lgame.dict)
词典文件lgame.dict由至多40,000行组成,文件的最后一行有'.' 表示文件的结束。其它各行每一行都是由至少3个小写字母,至多7 个小写字母组成的字符串。文件中的词已按字典顺序排序。
OUTPUT FORMAT:
(file lgame.out)
在文件lgame.out的第一行,你的程序应写上最高得分(子任务A).使用上面图形中给出的字母-值对应表。
随后的每一行是由文件lgame.dict中查到的具有这个得分的所有的词和或词对(word pairs)(子任务B)。要利用图中给定的字母的值。
当两个词能够形成 一个组合(具有给定的字母)时,这两个词应该打印到同一行,两个词中间用一个空格隔开。不许重复表示词对,例如'rag prom'和'prom rag'是同样的词对,只输出字典顺序较小的那个。
输出要按照字典顺序排序,如果两个词对第一个单词的顺序相同,则按照第二个单词。一个词对中的两个单词可以相同。
[编辑]SAMPLE
INPUT(file lgame.in)
prmgroa
[编辑]SAMPLE
INPUT(file lgame.dict)
profile program prom rag ram rom .
[编辑]SAMPLE
OUTPUT
24 program prom rag
解题思路:
读字典文件,将满足条件(每种字母的个数不超过输入序列中每个字母个数)的单词保存下来,存与diction中,diction_num保存diction的条数
对单个单词,顺序列举一遍diction就能进行处理
对两个单词,用两层循环来列举diction中选取两个单词的所有可能(i = [0, diction_num),j = [i, diction_num))
在列举过程中更新最高得分,并且存储相应的单词和词组,最后得到的结果输出即可
代码:
/* ID: zc.rene1 LANG: C PROG: lgame */ #include<stdio.h> #include<stdlib.h> #include<string.h> struct unit { int letter[26]; char str[8]; int score; }; struct unit diction[40000]; int diction_num = 0; int SCORE[26] = {2, 5, 4, 4, 1, 6, 5, 5, 1, 7, 6, 3, 5, 2, 3, 5, 7, 2, 1, 2, 4, 6, 6, 7, 5, 7}; int in[26]; char result[10000][10]; int result_num = 0; void GetInput(FILE *fin) { char str[8]; int i; memset(in, 0, 26 * sizeof(int)); memset(str, 0, 8 * sizeof(char)); fscanf(fin, "%s", str); 4000 for (i=0; i<strlen(str); i++) { in[str[i] - 'a']++; } } int GetScore(const int *letter) { int i, sum = 0; for (i=0; i<26; i++) { if (letter[i] > in[i]) { return -1; } sum += letter[i] * SCORE[i]; } return sum; } void GetDict(FILE *dict) { char str[8]; int i, sc; int letter[26]; while (1) { fscanf(dict, "%s", str); if (str[0] == '.') { break; } memset(letter, 0, 26 * sizeof(int)); for (i=0; i<strlen(str); i++) { letter[str[i] - 'a']++; } sc = GetScore(letter); if (sc != -1) { memcpy(diction[diction_num].letter, letter, 26 * sizeof(int)); memcpy(diction[diction_num].str, str, 8 * sizeof(char)); diction[diction_num].score = sc; diction_num++; } } } int GetResult(void) { int i, j, k; int sc1, sc2, sc; int max = -1; int lt[26]; for (i=0; i<diction_num; i++) { sc = diction[i].score; if (sc > max) { memset(result, 0, 10000 * 10 * sizeof(char)); max = sc; result_num = 0; strcpy(result[result_num], diction[i].str); result_num++; } else if (sc == max) { strcpy(result[result_num], diction[i].str); result_num++; } for (j=i; j<diction_num; j++) { for (k=0; k<26; k++) { lt[k] = diction[i].letter[k] + diction[j].letter[k]; } sc = GetScore(lt); if (sc > max) { memset(result, 0, 10000 * 10 * sizeof(char)); max = sc; result_num = 0; strcpy(result[result_num], diction[i].str); result[result_num][strlen(diction[i].str)] = ' '; strcat(result[result_num], diction[j].str); result_num++; } else if (sc == max) { strcpy(result[result_num], diction[i].str); result[result_num][strlen(diction[i].str)] = ' '; strcat(result[result_num], diction[j].str); result_num++; } } } return max; } int main(void) { FILE *fin, *fout, *dict; int i, max; fin = fopen("lgame.in", "r"); dict = fopen("lgame.dict", "r"); fout = fopen("lgame.out", "w"); GetInput(fin); GetDict(dict); max = GetResult(); fprintf(fout, "%d\n", max); for (i=0; i<result_num; i++) { fprintf(fout, "%s\n", result[i]); } return 0; }
相关文章推荐
- 2013第47周五抱怨负能量
- Maven的配置文件pom.xml
- 道德经全文 镇楼
- 安卓基础学习_应用的界面编程
- PCB中的过孔
- 微信公众平台开发介绍(三)
- Hibernate 注解 字段不映射的注解
- Android开发: 通过Intent 调用Camera应用 sample code
- qt sqlite 的初步使用
- dijkstra算法
- pMock 中的一些用法...
- Java正则表达式工具类实例
- XCOde 5 的界面布局一些新特性
- Class MockTestCase
- 单片机C语言while(1)的问题
- 工厂方法模式
- define AR_DLL_API __declspec(dllexport) 问题
- (转)Linux进程的睡眠和唤醒, 真正搞懂了吗?
- Mock类
- Java邮箱正则匹配