您的位置:首页 > 编程语言 > C语言/C++

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
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 word
BEAN’ 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 get
BEAAD’,
YAAD',
YAN’,
YKD' and
BEKD’. 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sicily C++