代码一是MOOC版视频中清华大学徐明星老师的算法:
//问题描述:
//有编号为0,1,2,3,4的5本书,准备分给5个人A,B,C,D,E,
//每个人阅读兴趣用一个二维数组描述,写一个程序,输出所有分书方案,让人人皆大欢喜
#include <iostream>
using namespace std;
int Num; //方案数
int take[5]; //5本书分别分给谁(用户编号)
bool assigned[5]; //5本书是否已分配
int like[5][5] = {
{0, 0, 1, 1, 0},
{1, 1, 0, 0, 1},
{0, 1, 1, 0, 1},
{0, 0, 0, 1, 0},
{0, 1, 0, 0, 1}
};
void Try(int id)
{
//递归终止条件:所有读者均已分配合适书籍
if(id == 5)
{
//方案数加1
Num++;
//输出方案细节
cout << "第" << Num << "个方案(按ABCDE次序):";
for(int i = 0; i < 5; i++)
cout << take[i] << ' ';
cout << endl;
return;
}
//逐一为每本书找到合适的读者
for(int book = 0; book <= 4; book++)
{
//是否满足分书条件
if((like[id][book] == 1) && !assigned[book])
//如果有人喜欢这本书,并且这本书尚未被分配
{
//记录当前这本书的分配情况
take[id] = book;
assigned[book] = true;
//为下一位读者分配合适书籍
Try(id + 1);
//将书退还(回溯),尝试另一种方案
assigned[book] = false;
}//__if__
}//__for__
}
int main()
{
Num = 0; //分书方案数初始值
for(int book = 0; book < 5; book++)
assigned[book] = false; //设初值5本书均未分配
Try(0); //从第0个人(A)开始分书
return 0;
}