这道题需要我们输出方案,即每个人分别领到了什么书,我们可以使用数组来代表每个人对于五本书的喜好情况。
鉴于数据量较大,如果一个一个遍历较为复杂,我们使用“回溯法”,即碰到一条路走不通,马上回头,选择下一条路。
#include<stdio.h>
#include<iostream>
using namespace std;
int take[5],n;//take[5]用于记录第i号人拿了第j本书
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}};//使用二维数组记录每个人的喜爱情况;
int book[5]={0,0,0,0,0};//通过1和0来分别表示每本书有没有被拿取
void Try(int i);
void Try(int i)
{
int j,k;
for(j=0;j<5;j++){
if((like[i][j]>0&&book[j]==0)) //如果第i号人喜爱j号书并且j号书还没被拿走,便可拿走
{take[i]=j;
book[j]=1; //i号拿走j号书,j号书被拿走
if(i==4)
{
n++;
cout<<"第"<<n<<"个方案\n";
for(k=0;k<=4;k++)
{
cout<<take[k]<<"号书分给"<<char(k+65)<<endl;
}
cout<<endl;
}
else
Try(i+1);//若还有人没拿到书,接着调用本函数拿书
take[i]=-1;//当函数调用全部完成,能够输出的方案输出完时,将拿的书退回,为j+1的情况做准备
book[j]=0;
}
}
}
int main(){
n=0;//预置方案数为0
Try(0);//调用函数,让子弹飞一会儿
return 0;}
参考代码如上。