蓝桥集训之带分数
-
核心思想:递归 + 暴力
- 因为就一个数 暴力就行了
- 1 - 9全排列 然后双指针ij分割成三部分 判断条件
cpp
#include<iostream>
#include<cstring>
using namespace std;
const int N = 10;
int num[N];
int target,res;
bool st[N];
int calc(int l,int r) //计算一段的数值(全排列)
{
int cnt=0;
for(int i=l;i<=r;i++)
{
cnt = cnt*10 + num[i];
}
return cnt;
}
int dfs(int u)
{
if(u == 9) //全排列完成 所有数都用过了
{
for(int i=0;i<7;i++) //分割三部分
{
for(int j=i+1;j<8;j++)
{
int a = calc(0,i);
int b = calc(i+1,j);
int c = calc(j+1,8);
if(a * c + b == c * target) res ++; //因为除法是整除 所以转化为加减乘
}
}
}
for(int i=1;i<=9;i++) //九个数遍历一遍
{
if(!st[i]) //没用过
{
st[i] = true;
num[u] = i;
dfs(u+1); //递归
st[i] = false; //恢复现场
}
}
return res;
}
int main()
{
cin>>target;
cout<<dfs(0)<<endl;
return 0;
}