c语言实现分书问题
最近递归的东西又有点忘了,再做几道题,把解题思路给大家分享分书问题:有5本书要分给A\B\C\D\E五个人,试写一个程序输出所有可能的情况,5个人对5本书的兴趣是一个二维数组like[5][5],
like[i][j]=1表示第i个人喜欢第j本书
\书 1 2 3 4 5
人 \____________________________
A | 0 0 1 1 0
B | 1 1 0 0 1
C | 0 1 1 0 1
D | 0 0 0 1 0
E | 0 1 0 0 1
==================================================================
解题思路:可能的着手点是以人为中心,然后依次遍历每一个人可能的情况,另外一个思路就是以书为中心,依次遍历所有可能的情况,这里以后一种思路实现.
这里需要依次遍历每一本书,找到一个人,对此本书感兴趣,而且这个人目前还没有分到书,将此本书分给此人,然后再去遍历下一本书,本问题需
要计算所有可能情况,所以需要有回溯
程序代码:/* 分书问题
*/
#include <stdio.h>
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}};
/*book数组用于记录某一本书是否已经分出去
0的时候代表没有,1代表已经分出去了*/
int book[5] = {0};
/*take数组记录了每一个人所领到的书的号码*/
int take[5] = {0};
/*分书程序,参数代表目前是第几本书*/
void Distribute(int read_num)
{
int book_num = 0;
int j = 0;
for (book_num = 0; book_num < 5; book_num++)
{
if (1 == like[read_num][book_num] && 0 == book[book_num])
{
book[book_num] = 1;
take[read_num] = book_num + 1;
if (4 == read_num)
{
for (j = 0; j < 5; j++)
printf("第%d个人得到第%d本书\n", j + 1, take[j]);
}
Distribute(book_num + 1);
book[book_num] = 0;
take[read_num] = 0;
}
}
return;
}
main()
{
Distribute(0);
return 0;
}







