最近正在阅读《算法的乐趣》,该书讲解穷举法时举例Google方程式,题目:
“ 有一个字符组成的等式:WWWDOT - GOOGLE = DOTCOM,每个字符代表一个0-9之间的数字,WWWDOT、GOOGLE和DOTCOM都是合法的数字,不能以0开头。请找出一组字符和数字的对应关系,使它们互相替换,并且替换后的数字能够满足等式。”
书中给出了关键的搜索函数和和整体思路,这里我把程序补充成完整的JAVA程序:
package Not.HelloWorld;
/**
* Created by workstation on 2016/10/31.
*/
public class NotHelloWorld {
static int MAX_CHAR_COUNT=0;
static int MAX_NUM_COUNT=0;
public static void main(String[] args) {
TagCharItem[] ci=new TagCharItem[]{new TagCharItem('W',-1,true),new TagCharItem('D',-1,true),
new TagCharItem('O',-1,true),new TagCharItem('T',-1,false),new TagCharItem('G',-1,false),
new TagCharItem('L',-1,false),new TagCharItem('E',-1,false), new TagCharItem('C',-1,false),new TagCharItem('M',-1,false)};
TagCharValue[] cv=new TagCharValue[]{
new TagCharValue(false,0), new TagCharValue(false,1), new TagCharValue(false,2),
new TagCharValue(false,3), new TagCharValue(false,4), new TagCharValue(false,5),
new TagCharValue(false,6), new TagCharValue(false,7), new TagCharValue(false,8),new TagCharValue(false,9)
};
MAX_CHAR_COUNT = ci.length;
MAX_NUM_COUNT=cv.length;
SearchingResult(ci,cv,0);
}
public static int MakeIntergerValue(TagCharItem[] ci,String string){
int convertResult=0;
for(int i =0;i<string.length();i++){
char c = string.charAt(i);
for(int j =0;j<MAX_CHAR_COUNT;j++){
if(c == ci[j].c){
convertResult = convertResult*10+ci[j].value;
}
}
}
return convertResult;
}
public static void callback(TagCharItem[] ci){
String minuend = "WWWDOT";
String subtrahend = "GOOGLE";
String diff = "DOTCOM";
int m = MakeIntergerValue(ci,minuend);
int s = MakeIntergerValue(ci,subtrahend);
int d = MakeIntergerValue(ci,diff);
if((m-s)==d){
System.out.println(m+"-"+s+"="+d);
}
}
public static boolean IsValueValid(TagCharItem charItem,TagCharValue charValue){
boolean flag = false;
if(!charValue.used){
flag = (!charItem.leading)||(charValue.value!=0);
}
return flag;
}
public static void SearchingResult(TagCharItem[] ci,TagCharValue[] cv,int index){
if (index == MAX_CHAR_COUNT){
callback(ci);
return;
}
for (int i =0 ;i<MAX_NUM_COUNT;++i){
if (IsValueValid(ci[index],cv[i])){
cv[i].used = true;
ci[index].value=cv[i].value;
SearchingResult(ci,cv,index+1);
cv[i].used= false;
}
}
}
}
class TagCharItem{
char c;
int value;
boolean leading;
TagCharItem(char c,int value,boolean leading){
this.c=c;
this.value=value;
this.leading=leading;
}
}
class TagCharValue{
boolean used;
int value;
TagCharValue(boolean used,int value){
this.used=used;
this.value=value;
}
}
程序具有通用性,只用将TagCharItem[] ci和TagCharValue[] cv进行修改就可以。