华为机试和尚挑水

问题描述:

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




  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值