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.