dfs

1.简单模板:

https://www.cnblogs.com/OctoptusLian/p/7429645.html(啊哈磊)

2.题目:蓝桥杯真题<带分数>

问题描述

100 可以表示为带分数的形式:100 = 3 + 69258 / 714。

还可以表示为:100 = 82 + 3546 / 197。

注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。

类似这样的带分数,100 有 11 种表示法。

输入格式

从标准输入读入一个正整数N (N<1000*1000)

输出格式

程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。

注意:不要求输出每个表示,只统计有多少表示法!

样例输入1
100
样例输出1
11
样例输入2
105
样例输出2
6
 
解答1:
 
代码:
#include<bits/stdc++.h>
using namespace std;
int n,num,p[10]={0};

int inc(int x){
    for(int i=0;i<9;i++)
        if(x==p[i])return 1;
        return 0;
}

int tonum(int x,int y){
    int res=0;
    for(int i=0;i<y;i++)
        res=res*10+p[x+i];
    return res;
}

void put(){
    int num1,num2,num3;
    for(int i=1;i<=7;i++)
    for(int j=1;j<=8-i;j++){
    //j代表从i开始的j个数
        if(j<9-i-j)continue;
        else{
            num1=tonum(0,i);
            num2=tonum(i,j);
            num3=tonum(i+j,9-i-j);
            if(num2%num3==0 && num1+num2/num3==n)num++;
        }
    }
}

void dfs(int u){
    if(u==9){
        put();return;}
    for(int i=1;i<=9;i++)
    if(!inc(i)){
        p[u]=i;
        dfs(u+1);
        p[u]=0;
    }
}

int main()
{
    scanf("%d",&n);
    dfs(0);
    printf("%d\n",num);
}
posted @ 2019-03-11 21:29  frente  阅读(167)  评论(0编辑  收藏  举报