代码二是清华大学出版社《程序设计基础》(第三版)中吴文虎老师的算法。
//问题描述:
//有编号为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)
{
//逐一为每本书找到合适的读者
for(int book = 0; book <= 4; book++)
{
//是否满足分书条件
if((like[id][book] > 0) && (assigned[book] == false))
//如果有人喜欢这本书,并且这本书尚未被分配
{
//记录当前这本书的分配情况
take[id] = book;
assigned[book] = true;
if(id == 4)
//这一行条件判断在递归调用Try(id + 1)之前,所以只需等于4就行了
{
Num++;
cout << "第" << Num << "个方案:\n";
for(int k = 0; k <= 4; k++)
{
cout << take[k] <<"号书分给" << char(k + 65) << endl;
//这里的char(k + 65)是强制类型转换
}
cout << endl;
}
else
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;
}