题目:7个和尚轮流挑水
按着别人的方法实现的~
回溯法实现
struct st
{
int space[8];//space=0表示没有空闲
int flag;//=0表示没挑过水
}monk[8];
int x[8],sum=0;
void backtrace(int n)
{
if(n > 7)
{
sum++;
printf("%d:\n",sum);
for(int j=1; j<=7; j++)
{
printf("星期%d和尚%d挑水\n",j,x[j]);
}
printf("\n");
}
else
{
for(int j = 1; j<=7; j++)
{
x[n] = j;
if(monk[j].flag==0 && monk[j].space[n]==1)
{
//判断和尚j是否已经挑过水及和尚星期n是否有空
monk[j].flag = 1;
backtrace(n+1);
monk[j].flag = 0;
}
}
}
}
主函数
输入和尚的空闲时间
backtrace(1)开始回溯,sum存放方案的总个数。
输入测试:
和尚0-7:
0 1 0 1 0 0 0
1 0 0 0 0 1 0
0 0 1 0 0 0 1
0 0 0 0 1 0 0
1 0 0 1 0 1 0
0 1 0 0 1 0 0
0 0 1 0 0 1 1