分书问题

来源:互联网 发布:ins图片下载软件 编辑:程序博客网 时间:2024/05/17 00:19
Time Limit: 1000 ms   Memory Limit: 256 MB
Total Submission: 41   Submission Accepted: 16
Judge By Case
Description
已知有n本书(从1~n编号)和n个人(从1~n编号),每个人都有一个自己喜爱的书的列表,现在请你编写一个程序,设计一种分书方案,使得每个人都能获得一本书,且这本书一定要在他的喜爱列表中。

Input
输入数据共若干行,第一行为一个正整数n(n <= 20),从第2行到第n+1行,每行有n个0或1组成,第k行表示编号为k-1的人对这n本书的喜好列表,0表示不喜欢,1表示喜欢。

Output
输出数据仅一个整数,表示符合条件的分配方案的总数。

Sample Input
OriginalTransformed
50011011001011000001001001
5[EOL] 00110[EOL] 11001[EOL] 01100[EOL] 00010[EOL] 01001[EOF] 

Sample Output
OriginalTransformed
1

#include<cstdio>#include<cmath>#include<cstring>#include<string>#include<iostream>#include<algorithm>#include<queue>#include<stack>#include<sstream>#include<map>//#define DEBUGconst int maxn =50;using namespace std;char G[maxn][maxn];vector<int>book[maxn];int visited[maxn];int ans, n;void dfs(int x);int main() {#ifdef DEBUGfreopen("Text.txt", "r", stdin);#endif // DEBUGcin.tie(0);cin.sync_with_stdio(false);while (cin >> n) {memset(book, 0, sizeof(book));memset(visited, 0, sizeof(visited));ans = 0;int i, j;for (i = 0; i < n; i++)for (j = 0; j < n; j++)cin >> G[i][j];for (i = 0; i < n; i++) {for (j = 0; j < n; j++) {//cout << G[i][j] << ends;if (G[i][j] == '1')book[i].push_back(j);}//cout << endl;}dfs(0);cout << ans << endl;}return 0;}void dfs(int x) {if (x == n) {bool flag = 1;for (int i = 0; i < n; i++)if (visited[i] == 0)flag=0;if (flag)ans++;return;}for (int i = 0; i < book[x].size(); i++) {if (visited[book[x][i]] == 0) {visited[book[x][i]] = 1;dfs(x + 1);visited[book[x][i]] = 0;}}}

0 0
原创粉丝点击