洛谷 P1657 选书
题目描述
学校放寒假时,信息学奥赛辅导老师有1,2,3……x本书,要分给参加培训的x个人,每人只能选一本书,但是每人有两本喜欢的书。老师事先让每个人将自己喜欢的书填写在一张表上。然后根据他们填写的表来分配书本,希望设计一个程序帮助老师求出所有可能的分配方案,使每个学生都满意。
输入输出格式
输入格式:
第1行:一个数x
第2行~第1+x行:每行两个数,表示ai喜欢的书的序号
输出格式:
只有一个数:总方案数total。
输入输出样例
说明
所有数据:x<=20
(世界上最难出数据的题目,没有之一……)
思路:搜索
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n,ans; int a[21],b[21],vis[21]; void dfs(int tot){ if(tot==n){ ans++; return ; } if(vis[a[tot+1]]&&vis[b[tot+1]]) return ; if(!vis[a[tot+1]]) vis[a[tot+1]]=1,dfs(tot+1),vis[a[tot+1]]=0; if(!vis[b[tot+1]]) vis[b[tot+1]]=1,dfs(tot+1),vis[b[tot+1]]=0; } int main(){ scanf("%d",&n); if(n==0){ cout<<"0";return 0; } for(int i=1;i<=n;i++) scanf("%d%d",&a[i],&b[i]); dfs(0); cout<<ans; }
细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。
雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。