问题描述:
<code><span style="font-family: FangSong_GB2312;">某寺庙里7个和尚:轮流挑水,为了和其他任务不能冲突,各人将有空天数列出如下表: 和尚1: 星期二,四; 和尚2: 星期一,六; 和尚3: 星期三,日; 和尚4: 星期五; 和尚5: 星期一,四,六; 和尚6: 星期二,五; 和尚7: 星期三,六,日; 请将所有合理的挑水时间安排表 </span></code>
输入7行7列,0代表和尚今天不挑水,1代表可以挑水,A和尚挑完水本周就不挑了,问有多少种挑水方法,排列组合是什么。
#include<stdlib.h>
#include<stdio.h>
void backtrack(int n);
/*函数功能:回朔求解第n天至第7天的解(即第n~7天分别安排和尚几)*/
struct st
{
int spare[8];
/*存储和尚的空闲时间,spare=0表示星期i没有空闲,spare=1表示星期i空闲,其中spare[0]不用*/
int flag;
/*用于标记和尚周内是否已经工作过,flag=0表示没挑过水,flag=1表示已经挑过水*/
}monk[8];
int x[8],sum=0;/*sum用于统计共有多少种方案*/
int main (int argc, char **argv)
{
int i,j;
for(i=1;i<=7;i++)
{/*初始化和尚的空闲时间,初始化时和尚全部没挑过水即flag都为0*/
printf("请输入和尚%d的空闲时间:",i);
for(j=1;j<=7;j++)
{
scanf("%d",&monk[i].spare[j]);
}
monk[i].flag=0;
}
backtrack(1);
printf("共有%d种方案\n",sum);
return 0;
}
void backtrack(int n)
{/*函数功能:回朔求解第n天至第7天的解(即第n~7天分别安排和尚几)*/
int j;
if(n>7)
{
sum++;
printf("方案%d:\n",sum);
for(j=1;j<=7;j++)
{
printf("星期%d和尚%d挑水\n",j,x[j]);
}
printf("\n");
}
else
{
for(j=1;j<=7;j++)
{
//monk[j].flag=0;
x[n]=j; //x[n]代表第n天是和尚j挑水
if(monk[j].flag==0&&monk[j].spare[n]==1)
{//判断和尚j是否已经挑过水及和尚星期n是否有空
monk[j].flag=1;
backtrack(n+1);
monk[j].flag=0;
}
}
}
}