65,211
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
using namespace std;
//有7个和尚,每人可以值一周中的两天,请输出一周所有可能值日表
//七个和尚(MONK)可以值日情况
int Monk[7][2] =
{
{1,2},//和尚1
{2,1},//和尚2
{4,3},//和尚3
{5,4},//和尚4
{3,7},//和尚5
{1,6},//和尚6
{7,5} //和尚7
};
int iSolutionNum = 0;
int WeekStat[7]; //标识每天安排值日的情况 true为已安排,false为未安排
void print();
int Schedule(int iCurMonk,int iWeekDate)
{
if (iCurMonk == 7)//iCurMonk从0到6为有效值,到7说明已全部安排完毕 -- 成功
{
iSolutionNum++;
print();
return 1;
}
else if (0 != WeekStat[iWeekDate-1])//iWeekDate取值范围是1-7,数组中对应星期是0-6所以减1
{
return 0;
}
else
{
if(-1 != iCurMonk)//第一次运行
{
WeekStat[iWeekDate-1] = iCurMonk+1;//iWeekDate取值范围是1-7,数组中对应星期是0-6所以减1
}
//因为一共就7个和尚,对应7天 所以每个和尚都必然被选择到
//不必像背包问题那样回溯,只要将每个和尚可以值的两天日回溯了就行
if (6 == iCurMonk)//已经递归到头了不需要再看第
{
Schedule(7,0);
}
else
{
Schedule(iCurMonk+1,Monk[iCurMonk+1][0]);//看和尚的可以值的第一个日是否可以分配
Schedule(iCurMonk+1,Monk[iCurMonk+1][1]);//看和尚的可以值的第二个日是否可以分配
}
WeekStat[iWeekDate-1] = 0;//递归每回退一层就将本层设置的值日状态清空
return 0;
}
}
void main()
{
Schedule(-1,0);
cout << "共有 " << iSolutionNum << " 种解决方案" <<endl;
}
void print()
{
cout << "解决方案\n";
for (int i =0; i<7; i++)
{
if (i != 6)
{
cout << WeekStat[i];
}
else
{
cout << WeekStat[i] << endl;
}
}
}