蓝桥杯 带分数 DFS应用

问题描述

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
 //法一
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;

int num[] = {1, 2, 3, 4, 5, 6, 7, 8, 9},
    N, ans;

int getSum(int lh, int rh)
{
    int sum = 0;
    for (int i = lh; i <= rh; i++)
    {
        sum = sum * 10 + num[i];
    }
    return sum;
}

void check()
{
    for (int i = 0; i < 9; i++)
    {
        int a = getSum(0, i);
        if (a > N) continue;
        for (int j = i + 1; j < 8; j++)
        {
            int b = getSum(i + 1, j);
            int c = getSum(j + 1, 8);
            if (b >= c && b % c == 0 && (a + b/c == N)) {
                ans++;
            }
        }
    }
}

void solve()
{
    cin >> N;
    do {
        check();        
    } while(next_permutation(num, num + 9));
    printf("%d\n", ans);
}

int main()
{
    solve();
    return 0;
}

 //法二

 1 #include <algorithm>
 2 #include <cstring>
 3 #include <queue>
 4 #define INF 0x3f3f3f3f
 5 #define MAXN 100005
 6 #define Mod 10001
 7 using namespace std;
 8 int vis[10], n , ans;
 9 int num[10];
10 
11 
12 int getSum(int lh, int rh)
13 {
14     int sum = 0;
15     for (int i = lh; i <= rh; i++) {
16         sum = sum * 10 + num[i];
17     }
18     return sum;
19 }
20 
21 void check()
22 {
23     for (int i = 1; i <= 9; i++) {
24         int a = getSum(1, i);
25         if (a > n) continue;
26         for (int j = i + 1; j < 9; j++) {
27             int b = getSum(i + 1, j);  //[i+1, j]
28             int c = getSum(j + 1, 9);  //[j+1, 9]
29             if (b >= c && b % c == 0 && a + b/c == n) {
30                 ans++;
31             }
32         }
33     }
34 }
35 
36 void dfs(int step)
37 {
38     if (step == 10) {
39         check();
40     }
41     else {
42         for (int i = 1; i <= 9; i++) {
43             if (!vis[i]) {
44                 num[step] = i;
45                 vis[i] = 1;
46                 dfs(step + 1);
47                 vis[i] = 0;
48             }
49         }
50     }
51     
52 }
53 
54 int main()
55 {
56     scanf("%d", &n);
57     ans = 0;
58     memset(vis, 0, sizeof(vis));
59     dfs(1);
60     printf("%d\n", ans);
61     return 0;
62 }

 

 //这里补充一个next_permutation()的用法
//蓝桥杯 2015省赛 第3题 三羊献瑞
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;

int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int b, c;
int d;

void solve()
{
    do {
        b = a[0]*1000 + a[1]*100 + a[2]*10 + a[3];
        c = a[4]*1000 + a[5]*100 + a[6]*10 + a[1];
        d = a[4]*10000 + a[5]*1000 + a[2]*100 + a[1]*10 + a[7];
//        if (b + c == d) {
//            cout << b << " + " << c << " = " << d << endl;
//        }
    } while (next_permutation(a, a + 10));
}

int main()
{
    solve();
    return 0;
}

//发现好多蓝桥杯省赛的题目 都可以用 next_permutation()轻松解决..

//还有之前整理的一个题目: http://www.cnblogs.com/douzujun/p/6669303.html

 
 
posted @ 2017-03-15 00:57  douzujun  阅读(563)  评论(0编辑  收藏  举报