题目描述:
学校放寒假时,信息学竞赛辅导老师有A,B,C,D,E五本书,要分给参加培训的张、王、刘、孙、李五位同学,每人只能选一本书。老师事先让每个人将自己喜欢的书填写在如下的表格中。然后根据他们填写的表来分配书本,希望设计一个程序帮助老师求出所有可能的分配方案,使每个学生都满意。
输入
无输入。
输出
输出所有选书方案,每种方案六行;
每一行输出方案数,格式:answer XX:(XX为方案数)
接下来五行输出五位学生所选的书,五位学生姓名用"Student Zhang, Student Wang, Student Liu, Student Sun, Student Li"表示,参考样例输出。
样例输出
answer 1: Student Zhang:C Student Wang:A Student Liu:B Student Sun:D Student Li:E
代码如下:
#include<iostream>
using namespace std;
int a[5][5] = { {0,0,1,1,0},{1,1,0,0,1},{0,1,1,0,0},{0,0,0,1,0},{0,1,0,0,1} };//喜爱
int answer = 0;
bool b[5] = { 0 }; //判断每本书是否已选
char c[5] = { 'A','B','C','D','E'};
char ans[5];//第1-5个人选择的书
void print()
{
cout << "answer " << answer << ":" << endl;
int i = 0;
while (i < 5)
{
switch (i) {
case 0:
{
cout << "Student Zhang:" << ans[i] << endl;
break;
}
case 1:
{
cout << "Student Wang:" << ans[i] << endl;
break;
}
case 2:
{
cout << "Student Liu:" << ans[i] << endl;
break;
}
case 3:
{
cout << "Student Sun:" << ans[i] << endl;
break;
}
case 4:
{
cout << "Student Li:" << ans[i] << endl;
break;
}
}
i++;
}
}
void search(int k)//k=4即为第五个学生
{
if (k == 5)
{
answer++;
print();
}
for (int i = 0;i < 5;i++)
{
if (!b[i] && a[k][i] == 1)
{
b[i] = 1;
ans[k] = c[i];
search(k + 1);
b[i] = 0;
ans[k] = '0';
}
}
}
int main()
{
search(0);//第一个学生开始
}