递归和递推(二)
AcWing1209.带分数
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 10;
bool used[N];
int n;
int cnt;
bool st[N], backup[N];
// bool check(int a, int c){
// int b = n * c - a * c;
// if(!a || !b || !c)return false;
// while(b){
// int x = b % 10;
// b /= 10;
// if(!x || used[x])return false;
// used[x] = true;
// }
// for(int i = 1; i < N; i++){
// if(!used[i])return false;
// }
// return true;
// }
bool check(int a, int c)
{
long long b = n * (long long)c - a * c;
if (!a || !b || !c) return false;
memcpy(backup, used, sizeof used);
//一定一定要备份数据,否则进行一次check判断后将used[]中的数据改变
while (b)
{
int x = b % 10; // 取个位
b /= 10; // 个位删掉
if (!x || backup[x]) return false;
backup[x] = true;
}
for (int i = 1; i <= 9; i ++ )
if (!backup[i])
return false;
return true;
}
void dfs_c(int u, int a, int c){
if(u > 9)return;
if(check(a, c))cnt++;
for(int i = 1; i < N; i++){
if(!used[i]){
used[i] = true;
dfs_c(u + 1, a, c * 10 + i);
used[i] = false;
}
}
}
void dfs_a(int u, int a){
if(a >= n)return;
if(a)dfs_c(u, a, 0);
for(int i = 1; i < N; i++){
if(!used[i]){
used[i] = true;
dfs_a(u + 1, a * 10 + i);
used[i] = false;
}
}
}
int main()
{
scanf("%d", &n);
dfs_a(0, 0);
printf("%d", cnt);
return 0;
}

浙公网安备 33010602011771号