参考书目:《算法的乐趣》作者: 王晓华
题目:
有一个字符组成的等式:WWWDOT - GOOGLE = DOTCOM,每个字符代表一个0-9之间的数字,WWWDOT、GOOGLE和DOTCOM都是合法的数字,不能以0开头。请找出一组字符和数字的对应关系,使它们互相替换,并且替换后的数字能够满足等式。
想了好久没编出来,网上找了几篇博客参考,仅作记录。
总结博客:总结google题WWWDOT – GOOGLE = DOTCOM 不同解法
C++版:练习程序:算法系列1:Google方程式
C++的另一种思路:google方程式
C语言版本(转载):Google方程式
Python版:Python-穷举搜索Google方程式
/*
2018-3-25
穷举搜索:Google方程式
WWWDOT-GOOGLE=DOTCOM
copyright @GCN
*/
typedef unsigned char bool;
#define true 1
#define false 0
#include
#include
#include
#define MAX_CHAR_COUNT 9
#define MAX_VALUE_COUNT 10
typedef struct tagCharItem
{
char c;
int value;
bool leading;
}CHAR_ITEM;//字符元素列表
typedef struct tagCharValue
{
int value;
bool used;
}CHAR_VALUE;//穷举约束
CHAR_ITEM charItem[]={{'W',-1,true},{'D',-1,true},{'O',-1,false},
{'T',-1,false},{'G',-1,true},{'L',-1,false},
{'E',-1,false},{'C',-1,false},{'M',-1,false}};
CHAR_VALUE charValue[]={{0,false},{1,false},{2,false},{3,false},{4,false},
{5,false},{6,false},{7,false},{8,false},{9,false}};
int getCharValue(CHAR_ITEM ci[], char ch)
{
int i = 0;
for ( i = 0; i < MAX_CHAR_COUNT; i++)
{
if ( ci[i].c == ch)
{
return ci[i].value;
}
}
return -1;
}
int MakeIntegerValue(CHAR_ITEM ci[],char st[])
{
int len=strlen(st);
int tmp=0;
if ( (NULL == ci) || (NULL == st))
{
return -1;
}
do
{
tmp = tmp * 10 + getCharValue(ci, *st);
st++;
len--;
} while ( 0 != len);
return tmp;
}
int IsValueValid(CHAR_ITEM ci,CHAR_VALUE cv)
{//评估函数,对三个字符首字符为0的情况进行剪枝
if(cv.used)
return false;
if(ci.leading&&cv.value==0)
{
return false;
}
return true;
}
void OnCharListReady(CHAR_ITEM ci[])
{//回调函数
char *minuend="WWWDOT";
char *Subtrahend="GOOGLE";
char *diff="DOTCOM";
int m=MakeIntegerValue(ci,minuend);
int s=MakeIntegerValue(ci,Subtrahend);
int d=MakeIntegerValue(ci,diff);
if((m-s)==d)
{
printf("m=%d\ns=%d\nd=%d\n",m,s,d);
printf("%d-%d=%d\n",m,s,d);
}
}
void SearchingResult(CHAR_ITEM ci[],CHAR_VALUE cv[],int index)
{//对每个字符进行数字遍历。index参数标识字符索引
int i;
if(index == MAX_CHAR_COUNT)
{//结束条件判断和结果输出
OnCharListReady(ci);
return;
}
for(i = 0; i < MAX_VALUE_COUNT; ++i)
{
if(IsValueValid(ci[index],cv[i]))
{
cv[i].used = true;/*set used sign*/
ci[index].value = cv[i].value;
SearchingResult(ci, cv, index + 1);
cv[i].used = false;/*clear used sign*/
}
}
}
int main()
{
SearchingResult(charItem,charValue,0);
printf("That's all!");
return 0;
}