代码二是清华大学出版社《程序设计基础》(第三版)中吴文虎老师的算法。
//问题描述: //有编号为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; }