递归和递推(二)

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;
}
posted @ 2022-02-06 15:59  CDUT的一只小菜鸡  阅读(34)  评论(0)    收藏  举报