我们可以把图书馆这本书看成一份资源 资源如果等于0 说明需要还书 如果大于等于0 既可以还书 也可以借书
函数代码如下:
void f(int returnbook, int borrowbook,int resource,string& queueresult, int& resolutionnumber)
{
if(borrowbook == 0&&resource>=0) //所有借书的人都满足了输出结果
{
cout << queueresult<<endl;
resolutionnumber++;
return;
}
if(resource==0&&returnbook>0) //图书馆已无书,则先还
{
queueresult+='1'; //"1'代表还书
f(returnbook-1,borrowbook,resource+1,queueresult,resolutionnumber);
}
else
{
if(returnbook>0) //图书馆存在书并且还有书未还,则既可借亦可还
{
queueresult+='1';
f(returnbook-1,borrowbook,resource+1,queueresult,resolutionnumber); //还书之后资源加1 而还的书的数目就减1
queueresult[queueresult.length()-1]='0';//"0'代表借书
f(returnbook,borrowbook-1,resource-1,queueresult,resolutionnumber);//借书之后资源减1 而借的书的数目就减1
}
else
{
if(resource>0) //图书馆存在书并且书全已还,则只可借
{
queueresult+='0';
f(returnbook,borrowbook-1,resource-1,queueresult,resolutionnumber); //还书之后资源加1 而还的书的数目就减1
}
}
}
if(!queueresult.empty()) //还原结果
queueresult.erase(queueresult.length()-1,1);
}
测试程序:
#include <iostream>
#include <string>
using namespace std;
void f(int returnbook, int borrowbook,int resource,string& queueresult, int& resolutionnumber);
int main()
{
string queueresult;
int resolutionnumber=0;
int returnbook,borrowbook,resource;
cin>>returnbook>>borrowbook>>resource;
f(returnbook,borrowbook,resource,queueresult,resolutionnumber);
cout << resolutionnumber <<endl;
return 0;
}
输入:
3 3 0
输出结果如下:
110100
110010
101100
101010
5