DFS---选书

    科技2023-09-25  79

    选书

    题目描述 学校放寒假时,信息学奥赛辅导老师有1,2,3……x本书,要分给参加培训的x个人,每人只能选一本书,但是每人有两本喜欢的书。老师事先让每个人将自己喜欢的书填写在一张表上。然后根据他们填写的表来分配书本,希望设计一个程序帮助老师求出所有可能的分配方案,使每个学生都满意。

    输入格式 第1行:一个数x

    第2行~第1+x行:每行两个数,表示ai喜欢的书的序号

    输出格式 只有一个数:总方案数total。

    输入输出样例 输入 5 1 3 4 5 2 5 1 4 3 5

    输出 2

    算法思路: 一道变形的dfs,从第一个人开始分别判断每个人喜欢的第一本和第二本书是否被其他人取走,如果没有,就把这本书给这个人,继续判断下一个人。注意要特判x = 0;

    #include<bits/stdc++.h> using namespace std; int a[25][2]; int b[25]; int x; int sum = 0; void dfs(int step) { if(step == x + 1) { sum++;return ; } for(int i = 0;i < 2;i++) { if(b[a[step][i]] == 0) { b[a[step][i]] = 1; dfs(step + 1); b[a[step][i]] = 0; } } } int main() { cin >> x; if(x == 0) { cout << 0; return 0; } for(int i = 1;i <= x;i++) { cin >> a[i][0] >> a[i][1]; } dfs(1); cout << sum; return 0; }```
    Processed: 0.016, SQL: 8