排列数字

AcWing 94. 递归实现排列型枚举

#include<stdio.h>
#define X 20
int n;
int used[X];
int st[X];
void dfs(int u)
{
    
    if(u>n){
        for(int i = 1 ;i <= n ; i++)
            printf("%d ",st[i]);
        puts("");
        return;
    }
    for(int i = 1 ; i <= n ;i++){
        if(!used[i]){
            used[i]=1;
            st[u]=i;
            dfs(u+1);
            used[i]=0;
        }
    }
}

int main(void)
{
    scanf("%d",&n);
    dfs(1);
    return 0;
}

简单的dfs排列数字即可

AcWing 1209. 带分数

#include <iostream>
#include <cstdio>

using namespace std;

int res;
int used[10];
int a[10];
int n ;

// 整数部分 分子 分母
// 先枚举整数部分
// 再枚举分子部分

int cnt (int l,int r)
{
    int s = 0;
    for(int i = l; i <= r; i ++)
   {
        s *= 10;
        s += a[i];
    }
    return s;
}

void dfs(int x)
{
    if(x == 10)
    {
        for(int i = 1; i <= 9; i ++)
            for(int j = i + 1; j + 1 <= 9; j ++)
            {
                int a = cnt(1,i);
                if(a > n) continue;
                int b = cnt(i+1,j),c = cnt(j+1,9);
                if(b % c) continue;
                if( a + b / c == n) res ++;       
            }
        return;
    }
    
    for(int i = 1 ; i < 10 ; i ++)
    {
        if(!used[i])
        {
            used[i] = 1;
            a[x] = i;
            dfs(x + 1);
            used[i] = 0;
        }
    }
}

int main(void)
{
    
    scanf("%d", &n);
    dfs(1);
    printf("%d\n", res);

    return 0;
}

先全排列1到9的所有数字,再划分整数,分子,分母.
如果分子能够整除分母,并且整数部分加分数部分的和为n,那么记作一种情况.
写这题的时候感觉是能写出来的,但是怕会TLE,想了很久能不能优化,浪费不少时间,实际上不剪枝优化什么乱七八糟的硬写也是能过的.
稍微剪枝优化下比原来没剪枝的时候快了1/4.