您的位置:首页 > 其它

华为机试和尚挑水

2015-09-16 16:32 274 查看
#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
=j; //x
代表第n天是和尚j挑水
                    if(monk[j].flag==0&&monk[j].spare
==1) 
                    {//判断和尚j是否已经挑过水及和尚星期n是否有空 
                                monk[j].flag=1;         
                                backtrack(n+1);         
                                monk[j].flag=0;                                                 
                    }                                         
                }         
                                         
        } 
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: