三羊献瑞|2015年蓝桥杯B组题解析第三题-fishers

岁酱吖の 提交于 2020-03-04 18:02:50

三羊献瑞

观察下面的加法算式:

  祥 瑞 生 辉
  • 三 羊 献 瑞

    三 羊 生 瑞 气

(如果有对齐问题,可以参看【图1.jpg】)

其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。

请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。

答案:1085

思路一:暴力法,8层循环,从0~9中选8个数参与加法运算,筛选条件:满足abcd+efgb = efcbx

思路二:dfs求全排列,筛选条件满足:abcd+efgb = efcbx

代码一暴力枚举:

#include<iostream>
using namespace std;

/*枚举法,暴力解法*/

int main(){
//  abcd + efgb
    for(int a = 1;a<=9;a++){
        for(int b = 0;b<=9;b++){
            if(b == a){
                continue;
            }
            for(int c = 0;c<=9;c++){
                if(c==b || c==a){
                    continue;
                }
                for(int d = 0;d<=9;d++){
                    if(d==c || d==b || d==a){
                        continue;
                    }
                    for(int e = 1;e<=9;e++){
                        if(e==d || e==c ||e ==b || e==a){
                            continue;
                        }
                        for(int f=0;f<=9;f++){
                            if(f == e|| f==d ||f == c || f==b || f==a){
                                continue;
                            }
                            for(int g=0;g<=9;g++){
                                if(g==f ||g == e|| g== d|| g==c ||g == b|| g==a){
                                    continue;
                                }

                                int x = a*1000+b*100+c*10+d;
                                int y = e*1000+f*100+g*10+b;
                                int z = e*10000+f*1000+c*100+b*10;
                                //筛选条件 
                                for(int i=0;i<=9;i++){
                                    if(i==a||i==b||i==c||i==d||i==e||i==f||i==g){
                                        continue;
                                    }
                                    
                                    if(x+y == z+i){
                                        cout<<y<<endl;
                                    }
                                }
                                
                            }
                        }
                        
                    }
                }
            }
        }
    }
    return 0;
}

代码二dfs全排列:

#include<iostream>
using namespace std;

bool visited[10];
int arr[10];


//参数k表示第k个位置 共8个位置 abcd + efgh 
void dfs(int k){
    if(k==9){
        //判断条件
        int x = 1000*arr[1] + 100*arr[2] + 10*arr[3] + arr[4];
        int y = 1000*arr[5] + 100*arr[6] + 10*arr[7] + arr[2];
        int z = 10000*arr[5] + 1000*arr[6] + 100*arr[3] + 10*arr[2];
        for(int i = 0;i<=9;i++){
            if(!visited[i]){
                z = z + i;
                if(z == x+y){
                    cout<<y<<endl;
                }
                z = z - i;
            }
        } 
        return; 
    }
    if(k==1 || k==5){
        for(int i=1;i<=9;i++){
            if(!visited[i]){
                visited[i] = true;
                arr[k] = i;
                dfs(k+1);
                visited[i] = false;
            }
        }
    }else{
        for(int i=0;i<=9;i++){
            if(!visited[i]){
                visited[i] = true;
                arr[k] = i;
                dfs(k+1);
                visited[i] = false;
            }
        }       
    }
}

int main(){
    dfs(1);
} 
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!