zoukankan      html  css  js  c++  java
  • 蓝桥杯模拟赛 猜算式【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;
    }

  • 相关阅读:
    再谈树形dp
    洛谷 P3627 [APIO2009]抢掠计划
    树状数组
    树形dp 入门
    洛谷P2014 选课
    洛谷P2015 二叉苹果树
    9 vue.js 被观察数组的变异方法
    8 vue的v-model指令学习
    7vue-事件修饰符
    6.vue事件绑定-click
  • 原文地址:https://www.cnblogs.com/Elaine-DWL/p/6664360.html
Copyright © 2011-2022 走看看