版权声明:JCBP工作室 & A.pro https://blog.csdn.net/Apro1066/article/details/82391336
题目描述
学校放寒假时,信息学奥赛辅导老师有1,2,3……x本书,要分给参加培训的x个人,每人只能选一本书,但是每人有两本喜欢的书。老师事先让每个人将自己喜欢的书填写在一张表上。然后根据他们填写的表来分配书本,希望设计一个程序帮助老师求出所有可能的分配方案,使每个学生都满意。
输入输出格式
输入格式:
第1行:一个数x
第2行~第1+x行:每行两个数,表示ai喜欢的书的序号
输出格式:
只有一个数:总方案数total。
输入输出样例
输入样例#1
5 1 3 4 5 2 5 1 4 3 5
输出样例#1
2
思路
产生书的全排列
#include <stdio.h>
#include <iostream>
using namespace std;
int a[21][21],f[21],s,n;//a[i][j]第i个人喜欢第j本书
inline void dfs(int i)//dfs产生全排列
{
register int j;
for(j=1;j<=n;j++)
{
if(f[j] && a[i][j])//这本书没选且第i个人喜欢这本书
{
f[j]=0;//标记读过了
if(i==n)
{
s++;
}
else
{
dfs(i+1);
}
f[j]=1;//还原
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int i,x,y;
cin>>n;
for(i=1;i<=n;i++)
{
cin>>x>>y;
a[i][x]=1;
a[i][y]=1;
f[i]=1;
}
dfs(1);
cout<<s<<endl;
return 0;
}