Sicily 1001. Alphacode
2015-12-20 02:10
369 查看
Time Limit: 1 secs, Memory Limit: 32 MB
Description
Alice and Bob need to send secret messages to each other and are discussing ways to encode their messages: Alice: “Let’s just use a very simple code: We’ll assign
Input
Input will consist of multiple input sets. Each set will consist of a single line of digits representing a valid encryption (for example, no line will begin with a 0). There will be no spaces between the digits. An input line of `0’ will terminate the input and should not be processed
Output
For each input set, output the number of possible decodings for the input string. All answers will be within the range of a long variable.
Sample Input
25114
1111111111
3333333333
0
Sample Output
6
89
1
题目要求:在给定一套编码系统,并假定数字1~26分别代表字母A~Z的前提下;给出一组数字并要求求出这组数字可能的编码数量。
分析:根据本题的题意,可以总结出以下特点:
一、数字编码的范围是1~26,所以超出这个范围的数字不予考虑,也就是说最多只存在两位数编码。
二、要考虑数字0的特殊性,虽然题目规定0不会出现在首位,但是0可以出现在其他位置;当前面一个数字是0时为保证编码的正确性,后一位数字不能是0。
解题思路:一开始想到使用递归来解决本题,基本思路是从第一位数字a1开始,依次序加入第二位数字a2…直至所有数字加入,假如当前数字ai可以和它前一位数字ai-1匹配,那么加入ai后数串的编码数量为不加ai的编码数量加上不加ai-1的编码数量之和,否则加入ai后编码数量不变。但是由于使用递归,当数据比较大时,程序效率较低。故改为使用数组执行以上操作,申明一个记录当前数位的数组,遍历一遍数组之后数组的末尾元素即为编码数量。get?
Description
Alice and Bob need to send secret messages to each other and are discussing ways to encode their messages: Alice: “Let’s just use a very simple code: We’ll assign
A' the code word 1,B’ will be 2, and so on down to
Z' being assigned 26." Bob: "That's a stupid code, Alice. Suppose I send you the wordBEAN’ encoded as 25114. You could decode that in many different ways!” Alice: “Sure you could, but what words would you get? Other than
BEAN', you'd getBEAAD’,
YAAD',YAN’,
YKD' andBEKD’. I think you would be able to figure out the correct decoding. And why would you send me the word `BEAN’ anyway?” Bob: “OK, maybe that’s a bad example, but I bet you that if you got a string of length 500 there would be tons of different decodings and with that many you would find at least two different ones that would make sense.” Alice: “How many different decodings?” Bob: “Jillions!” For some reason, Alice is still unconvinced by Bob’s argument, so she requires a program that will determine how many decodings there can be for a given string using her code.
Input
Input will consist of multiple input sets. Each set will consist of a single line of digits representing a valid encryption (for example, no line will begin with a 0). There will be no spaces between the digits. An input line of `0’ will terminate the input and should not be processed
Output
For each input set, output the number of possible decodings for the input string. All answers will be within the range of a long variable.
Sample Input
25114
1111111111
3333333333
0
Sample Output
6
89
1
题目要求:在给定一套编码系统,并假定数字1~26分别代表字母A~Z的前提下;给出一组数字并要求求出这组数字可能的编码数量。
分析:根据本题的题意,可以总结出以下特点:
一、数字编码的范围是1~26,所以超出这个范围的数字不予考虑,也就是说最多只存在两位数编码。
二、要考虑数字0的特殊性,虽然题目规定0不会出现在首位,但是0可以出现在其他位置;当前面一个数字是0时为保证编码的正确性,后一位数字不能是0。
解题思路:一开始想到使用递归来解决本题,基本思路是从第一位数字a1开始,依次序加入第二位数字a2…直至所有数字加入,假如当前数字ai可以和它前一位数字ai-1匹配,那么加入ai后数串的编码数量为不加ai的编码数量加上不加ai-1的编码数量之和,否则加入ai后编码数量不变。但是由于使用递归,当数据比较大时,程序效率较低。故改为使用数组执行以上操作,申明一个记录当前数位的数组,遍历一遍数组之后数组的末尾元素即为编码数量。get?
#include <iostream> #include <string> using namespace std; int main() { string str; // 使用string来存储更方便对数位进行操作 while (cin >> str && str != "0") { int x[10001] = {1, 1}; if (str.length() == 1) // 长度为1直接进行输出 { cout << 1 << endl; continue; } if (str[1] - '0' + (str[0] - '0') * 10 <= 26 && str[1] != '0') // 初始化数组 x[1] = 2; else x[1] = 1; for (int i = 2; i < str.length(); i++) // 循环更新数组,注意对数字‘0’的操作 { if (str[i] == '0') { if (str[i - 1] == '0') { x[str.length() - 1] = 0; break; } else if (str[i] - '0' + (str[i - 1] - '0') * 10 <= 26) x[i] = x[i - 2]; else { x[str.length() - 1] = 0; break; } } else if (str[i - 1] == '0') x[i] = x[i - 1]; else if (str[i] - '0' + (str[i - 1] - '0') * 10 <= 26) x[i] = x[i - 1] + x[i - 2]; else x[i] = x[i - 1]; } cout << x[str.length() - 1] << endl; } return 0; }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性
- C++ Custom Control控件向父窗体发送对应的消息