蓝桥杯模拟赛 猜算式【DFS】


你一定还记得小学学习过的乘法计算过程,比如:

273
x 15
------
1365
273
------
4095

请你观察如下的乘法算式

***
x ***
--------
***
***
***
--------
*****

星号代表某位数字,注意这些星号中,
0~9中的每个数字都恰好用了2次。
(如因字体而产生对齐问题,请参看图p1.jpg)

请写出这个式子最终计算的结果,就是那个5位数是多少?

注意:只需要填写一个整数,不要填写任何多余的内容。比如说明文字。

思路:DFS

#include<stdio.h>
#include<iostream>
using namespace std;
int a[20];
int f[10];//计算0-9出现了多少次 
int f2[10];
void show(){
    for(int i=0;i<20;i++){
        if(i==3||i==6||i==9||i==12||i==15) printf("
%d",a[i]);
        else  printf("%d",a[i]);
        
    }
    printf("
-------------
");
}
bool ok(){
    for(int i=0;i<10;i++){
        if(f[i]>2) return false;
    }
    return true;
}
void dfs(int x){
    if(x==6){
        
        for(int i=0;i<10;i++){
            f[i]=f2[i];
        //    printf("%d,",f[i]);
        }
        int t=a[0]*100+a[1]*10+a[2];
        for(int i=6;i<13;i=i+3){
            if(i<9){
                if(a[5]*t/1000!=0) return;
                a[i]=a[5]*t/100;
                a[i+1]=a[5]*t/10%10;
                a[i+2]=a[5]*t%10;
            } 
            if(i==9){
                if(a[4]*t/1000!=0) return;
                a[i]=a[4]*t/100;
                a[i+1]=a[4]*t/10%10;
                a[i+2]=a[4]*t%10;
            }
            if(i==12){
                if(a[3]*t/1000!=0) return;
                a[i]=a[3]*t/100;
                a[i+1]=a[3]*t/10%10;
                a[i+2]=a[3]*t%10;
            }
            f[a[i]]++;
            f[a[i+1]]++;
            f[a[i+2]]++;
            if(!ok()) return;
        }
        int t1=a[3]*t*100+a[4]*t*10+a[5]*t;
        if (t1/100000!=0) return;
        a[15]=t1/10000;
        a[16]=t1/1000%10;
        a[17]=t1/100%10;
        a[18]=t1/10%10;
        a[19]=t1%10;
        
        for(int i=15;i<20;i++){
            f[a[i]]++;
            if(!ok()){
                return;
            }
        }
        show();
        return;
    }
    for(int i=0;i<10;i++){
        if(f2[i]<2){
            a[x]=i;
            f2[i]++;
            dfs(x+1);
            f2[i]--;
        }
    }
}
int main(){
    dfs(0);
    return 0;
}

原文地址:https://www.cnblogs.com/Elaine-DWL/p/6664360.html