穷举搜索:Google方程式

参考书目:《算法的乐趣》作者王晓华

算法的乐趣 


题目:

有一个字符组成的等式: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;
}


猜你喜欢

转载自blog.csdn.net/jesmine_gu/article/details/79689164