参考书目:《算法的乐趣》作者: 王晓华
题目:
有一个字符组成的等式: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<stdio.h> #include<stdlib.h> #include<string.h> #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; }