本专栏持续输出数据结构题目集,欢迎订阅。
题目
分书问题是指:已知 n 个人对 m 本书的喜好(n≤m),现要将 m 本书分给 n 个人,每个人只能分到 1 本书,每本书也最多只能分给 1 个人,并且还要求每个人都能分到自己喜欢的书。列出所有满足要求的方案。
本题请你实现小规模分书问题的嵌套循环算法。
输入格式:
输入第一行给出两个正整数 n 和 m(n≤m),即分书问题中的人数和书的数量。由于本题仅用于测试嵌套循环算法,故此处的 n 和 m 取固定值,分别为 n=3 和 m=4。
随后 n 行,每行给出 m 个关系矩阵元素。其中第 i 行第 j 个元素为 1 表示第 i 个人喜欢第 j 本书,为 0 则表示不喜欢。
输出格式:
按升序列出所有满足要求的方案,格式为 (s1, s2, s3)。其中si 表示第 i 个人分到了第 si 本书。
注:方案 (a1,a2,a3)<(b1,b2,b3) 是指存在 1≤k≤3,使得 ai=bi 对所有 1≤i<k 成立,并且有 ak<bk。
输入样例:
3 4
0 1 0 1
1 0 1 0
1 1 0 0
输出样例:
(2, 3, 1)
(4, 1, 2)
(4, 3, 1)
(4, 3, 2)
代码
#include <stdio.h>
int main() {
int n, m;
scanf("%d %d", &n, &m);
// 读取喜好矩阵 (1-based索引更符合题目描述)
int preference[4][5] = {0}; // preference[i][j]表示第i个人是否喜欢第j本书
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
scanf("%d", &preference[i][j]);
}
}
// 使用三层嵌套循环枚举所有可能的分配方案
// 第1个人可以选择的书
for (int s1 = 1; s1 <= m; s1++) {
// 第1个人必须喜欢这本书
if (preference[1][s1] != 1) {
continue;
}
// 第2个人可以选择的书,不能与第1个人重复
for (int s2 = 1; s2 <= m; s2++) {
if (s2 == s1 || preference[2][s2] != 1) {
continue;
}
// 第3个人可以选择的书,不能与前两个人重复
for (int s3 = 1; s3 <= m; s3++) {
if (s3 == s1 || s3 == s2 || preference[3][s3] != 1) {
continue;
}
// 找到一个有效方案,按格式输出
printf("(%d, %d, %d)\n", s1, s2, s3);
}
}
}
return 0;
}
837

被折叠的 条评论
为什么被折叠?



