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; }