luogu1657_选书
时空限制 1000ms/128MB
题目描述
学校放寒假时,信息学奥赛辅导老师有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
说明
所有数据:x<=20
(世界上最难出数据的题目,没有之一……)
代码
#include<iostream>
using namespace std;
const int N = 25;
int n,tot=0;
bool used[N],like[N][N];
void search(int i){
if (i>n){
tot++;
return;
}
for (int j=1; j<=n; j++) //把每本书都查一遍
if (!used[j] && like[i][j]){
used[j] = true;
search(i+1);
used[j] = false;
}
}
int main(){
cin>>n;
for (int i=1,x,y; i<=n; i++){
cin>>x>>y;
like[i][x]=like[i][y]=1; //喜欢的两本书
}
if (n) search(1); //从第一本书开始搜索
cout<<tot<<endl;
}