洛谷—— P1657 选书

https://www.luogu.org/problem/show?pid=1657

题目描述

学校放寒假时,信息学奥赛辅导老师有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

(世界上最难出数据的题目,没有之一……)

数据诡异、特判x==0的情况

 1 #include <cstdio>
 2 
 3 const int N(26);
 4 struct Book {
 5     int a,b;    
 6 }book[26];
 7 int n,ans;
 8 bool use[N];
 9 
10 void DFS(int now)
11 {
12     if(now==n+1) { ans++; return ; }
13     if(!use[book[now].a])
14     {
15         use[book[now].a]=1;
16         DFS(now+1);
17         use[book[now].a]=0;
18     }
19     if(!use[book[now].b])
20     {
21         use[book[now].b]=1;
22         DFS(now+1);
23         use[book[now].b]=0;
24     }
25 }
26 
27 int Presist()
28 {
29     scanf("%d",&n);
30     for(int i=1; i<=n; ++i)
31         scanf("%d%d",&book[i].a,&book[i].b);
32     DFS(1); if(!n) ans=0;
33     printf("%d
",ans);
34     return 0;
35 }
36 
37 int Aptal=Presist();
38 int main(int argc,char*argv[]){;}
——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
原文地址:https://www.cnblogs.com/Shy-key/p/7592878.html