[洛谷]P1657 选书 (#搜索 -1.17)

版权声明: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;
}

猜你喜欢

转载自blog.csdn.net/Apro1066/article/details/82391336