快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

澳门新葡新京是真的吗:google 竞赛题 SecretSum 的 C++ 解法



本文示例源代码或素材下载

SecretSum 是本次 google 角逐中第二轮淘汰赛的一道分值为 500 分角逐题。事实上,这道题目反而比同轮比赛中的那道 1000 分值的RecurringNumbers 难(RecurringNumbers 的难度水准充其量不过是道月朔门生奥数角逐题)。好了,闲话少叙,来看 SecretSum 的题目吧:

一、角逐题目

Problem Statement

We can substitute each digit of a number with a unique letter from ''A'' to ''Z''. This way we can write groups of numbers in a single representation. For example "ABA" can represent any of the following: 101, 151, 343, 767, 929. However, "ABA" cannot mean 555 because each letter must stand for a distinct digit. Furthermore, numbers cannot begin with 0 and thus ''A'' cannot be replaced by 澳门新葡新京是真的吗0. Given two such representations num1 and num2 and the result of their summation return the total number of possible combinations of numbers for which the e澳门新葡新京是真的吗quation holds. If no combinations are possible then return 0.

Definition

Class: SecretSum

Method: countPossible

Parameters: String, String, String

Returns: int

Method signature: int countPossible(String num1, String num2, String result)

(be sure your method is public)

Constraints

- num1, num2, and result will each contain exactly 3 uppercase letters (''A'' - ''Z'').

Examples

0)

"AAA"

"BBB"

"CCC"

Returns: 32

1)

"ABB"

"DEE"

"TTT"

Returns: 112

2)

"ABC"

"ABA"

"ACC"

Returns: 0

Leading zeroes are not allowed.

3)

"AAA"

"CDD"

"BAA"

Returns: 32

4)

"TEF"

"FET"

"AAA"

Returns: 12

5)

"ABC"

"ABC"

"BCE"

Returns: 5

We can have the following 5 sums:

124 + 124 = 248

125 + 125 = 250

249 + 249 = 498

374 + 374 = 748

375 + 375 = 750

6)

"AAA"

"AAA"

"BBB"

Return澳门新葡新京是真的吗s: 4

We can have the following 4 sums:

111 + 111 = 222

222 + 222 = 444

333 + 333 = 666

444 + 444 = 888

This problem statement is the exclusive and proprietary property of TopC澳门新葡新京是真的吗oder, Inc. Any unauthorized use or reproduction of this information without the prior written consent of TopCoder, Inc. is strictly prohibited. (c)2003, TopCoder, Inc. All rights reserved.

题目的意思大年夜致是这样的:数字0-9可以分手用A-Z中不相同的字母替代,这样就可以用字母组成的字符串代表一个数了。例如"ABA"可以代表: 101, 151, 343, 767, 929。但"ABA"弗成以代表555,由于不合的字母必须取不合的数字。此外每个作为开首的字母不取0值。编写一个类 SecretSum,该类中有一个原型为 int countPossible(string num1, string num2, string result)的函数。num1、num2 和 result 便是上面所描述的类型的字符串,此中 result 代表的数为 num1 和 num2 代表的数的和,并且这几个字符串都只含有3个A-Z的字母。返回值为可能取得的组合的总数。

2.3 判断候选的3个数是否匹配传入的字符串

我是这样判断的:首先在候选的3个数中,在相同字母呈现的对应位置的数必须相同.其次,该数字必须是未被应用过的。

后者的实现很简单,添加一个变量 int bUse[10]={0};。bUse[i](i=0-9)的值表示数字i被应用的环境,0表示未被应用过;1表示已经应用过了。初始化时都为0表示都未被应用过。当一个字母呈现的对应位置的数都相同时,若这个数字为i,则bUse[i]=1。

在前者的处置惩罚中,为了确定位置,我将传入的三个字符串当作一个2维的字母矩阵。num1,num2,result对应的一维下标值分手为0,1,2。该矩阵的第1维下标值和第2维下标值就可当作矩阵中字母的坐标。例如在例1中字母A的坐标为(0,0);D点的坐标为(1,0)。同样的措施也可为候选的3个数中的每个数字确定坐标。我添加了一个布局来保存上述的坐标:  typedef struct{

int dim1;

int dim2;

}POS;  此中dim1表示一个字母(数字)的第1维下标值。同理,dim2表示一个字母(数字)的第2维下标值。一个字母可能在多个位置呈现,以是我添加了个成员变量来保存每个字母在矩阵中呈现的位置:typedef vector

POSVEC;

POSVEC   m_letterPos[26];  //保存每个字母的呈现位置向量的数组  此中m_letterPos[0]保存字母A呈现的位置,m_letterPos[1]保存字母B呈现的位置,以此类推m_letterPos[25]保存字母Z呈现的位置。在字母矩阵中显然许多字母的位置向量为空,空向量对接下去的筛选判断根本没有用场,以是我又添加了个成员变量,来保存不为空的字母位置向量的指针typedef vector

POSPTRVEC;

POSPTRVEC  m_posptrVec;    //保存呈现的字母向量的指针显然上述2个成员变量同样必要在轮回筛选前初始化,代码同样添加到成员函数init中。添加后init代码如下:  void init(string **pStr)

{

int i,j;

memset(m_linePattern,0,sizeof(m_linePattern));

fo澳门新葡新京是真的吗r ( i = 0 ; i0)

m_posptrVec.push_back(&m_letterPos[i]);//将所有呈现的字母向量指针保存起来

}

}  详细判断候选的3个数字是否匹配时,先将这3个数字转换到3个字符串数组中去,这个转换可以应用sprintf函数。然后遍历m_posptrVec中非空的位置向量,判断每个保存在相同字母的位置向量中的位置,在响应的候选数字矩阵的响应位置的数是否相等,若相等则设置该数字以被应用,详细的IfMatch代码如下:  int IfMatch(int *maybe)

{

char numChar[3][4];

int bUse[10]={0};

int i,j;

for ( i = 0 ; i

您可能还会对下面的文章感兴趣: