题目https://www.luogu.com.cn/problem/P1657
记得最初做这道题时做了好久(笑)。
算法是深度优先搜索 + 状态回溯。
我们从第 个学生开始枚举,如果他喜欢的第一本书没有被选择了,那么我们选择并且标记。对于第二本书同理。
状态回溯
我们发现,单纯地进行标记找不到所有方案。
因此我们需要将状态复原。
这里我们需要将之前添加的标记复原,否则没法选择其他的方案。
其他的内容大家自行查阅。
实现
#include<bits/stdc++.h>
using namespace std;
int n,ans;
pair<int,int>a[25];
bool b[25];
void dfs(int x){
if(x>n){
ans++;
return;
}
if(!b[a[x].first]){
b[a[x].first]=1;
dfs(x+1);
b[a[x].first]=0;
}
if(!b[a[x].second]){
b[a[x].second]=1;
dfs(x+1);
b[a[x].second]=0;
}
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].first>>a[i].second;
}
dfs(1);
cout<<ans;
return 0;
}