选书

题目描述
学校放寒假时,信息学奥赛辅导老师有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<string.h>
int x,a,b,like[55][55],vis[55];//like[i][j]为第i个人,喜欢第j本书 
int sum;
void dfs(int i)
{
	for(int j=1;j<=x;j++)
	{
		if(vis[j]==0&&like[i][j]) //如果没有人选第j本书,且第i个人喜欢第j本书,j被i选择 
		{
			vis[j]=1;
			if(i==x) 
				sum++;//如果所有人到选到了,方案数加一 
			else  
				dfs(i+1);//不然,下一个人选 
			vis[j]=0;//回溯,i不选择j的情况 
		}
	}
}

int main()
{
	while(scanf("%d",&x)!=EOF)
	{
		sum=0;
		memset(like,0,sizeof(like));
		memset(vis,0,sizeof(vis));
		for(int i=1;i<=x;i++)
		{
			scanf("%d%d",&a,&b);
			like[i][a]=1;//标记i喜欢a,b两本书 
			like[i][b]=1;
		}	
		dfs(1);
		printf("%d\n",sum);
	}	
} 

(疲れた)

猜你喜欢

转载自blog.csdn.net/weixin_43326028/article/details/85238097