快速业务通道

google竞赛题SecretSum的C++解法

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30
2]) m_linePattern[i][1]=1;
      if ( ch[1]==ch[2]) m_linePattern[i][2]=1;
    }
    for ( i = 0; i<26; i++)
    {
      if (m_letterPos[i].size()>0)
        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 <3; i++)
      sprintf(numChar[i],"%d",maybe[i]);//将数字转换成字符串
    for ( i = 0; i < m_posptrVec.size(); i++)//遍历所有出现的字母
    {
      POSVEC &ps= (*m_posptrVec[i]);
      int ch = numChar[ps[0].dim1][ps[0].dim2]-''''0'''';//取得该字母第一个位置处的数字
      if ( bUse[ch] ) return 0; //如果数字已被使用就返回0
        
      //逐一比较其他位置出的数字是否都相同
      j=1;
      while( j < ps.size() )
      {
        int ch2 = numChar[ps[j].dim1][ps[j].dim2]-''''0'''';
        if (ch != ch2 ) return 0;
        j++;
      }
      bUse[ch] = 1;//将该数字设置为已被使用
    }
    return 1;
  }

2.4.×?oó???a??ààμ?êμ??′ú????×üè???:

#include <string>
#include <vector>
#include <stdlib.h>
#include <iostream>
using namespace std;
//****************************************************************
//àà??£oSecretSum
//×÷??£oroc£¨txqc4@sohu.com£?
//è??ú£o2005-12-26
//ó?í?: ±?′ú???aêμ??é?ê??oèüìa?ù×÷?£
//×¢òaê???£oè?ó?×a??£??′??±£3?±????μ?÷?£
//****************************************************************
class SecretSum{
????typedef struct{
????????int dim1;
????????int dim2;
????}POS;
????typedef vector<POS> POSVEC;
????typedef vector<POSVEC*> POSPTRVEC;
public :
????int countPossible(string num1, string num2, string result)
????{
????????string *pStr[]={&num1,&num2,&result};
????????init(pStr);
????????int i,j,count=0;
????????for ( i = 100; i<=899; i++)
????????{
????????????if ( ! IfNumOk(0, i)) continue;
????????????for ( j = 100; j <= 999-i; j++)
????????????{
????????????????if ( ! IfNumOk(1, j)) continue;
????????????????int maybe[]={i,j,i+j};
????????????????if ( ! IfNumOk(2, maybe[2])) continue;
????????????????if ( IfMatch (maybe))
????????????????{
????????????????????count++;
????????????????}
????????????}
????????}??
????????return count;
????}
????void init(string **pStr)
????{
????????int i,j;
??
????????memset(m_linePattern,0,sizeof(m_linePattern));
????????for ( i = 0 ; i< 3; i++)
????????{
????????????char ch[3];
????????????for ( j = 0; j<3; j++)
????????????{
????????????????ch[j] = (*pStr[i])[j];
?????

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号