Exercise(7):和尚挑水

来源:互联网 发布:人工智能在医疗领域 编辑:程序博客网 时间:2024/05/14 06:58
/*        范房清    【问题描述】和尚挑水     某寺庙里7个和尚:轮流挑水,为了和其他任务不能冲突,各人将有空天数列出如下表:    和尚1: 星期二,四;    和尚2: 星期一,六;    和尚3: 星期三,日;    和尚4: 星期五;    和尚5: 星期一,四,六;    和尚6: 星期二,五;    和尚7: 星期三,六,日;    请将所有合理的挑水时间安排表     【程序输入输出】    input:    请输入和尚1的空闲时间:0 1 0 1 0 0 0    请输入和尚2的空闲时间:1 0 0 0 0 1 0    请输入和尚3的空闲时间:0 0 1 0 0 0 1    请输入和尚4的空闲时间:0 0 0 0 1 0 0    请输入和尚5的空闲时间:1 0 0 1 0 1 0    请输入和尚6的空闲时间:0 1 0 0 1 0 0    请输入和尚7的空闲时间:0 0 1 0 0 1 1    output:    方案1:    星期1和尚2挑水    星期2和尚6挑水    星期3和尚3挑水    星期4和尚1挑水    星期5和尚4挑水    星期6和尚5挑水    星期7和尚7挑水    方案2:    星期1和尚2挑水    星期2和尚6挑水    星期3和尚7挑水    星期4和尚1挑水    星期5和尚4挑水    星期6和尚5挑水    星期7和尚3挑水    方案3:    星期1和尚5挑水    星期2和尚6挑水    星期3和尚3挑水    星期4和尚1挑水    星期5和尚4挑水    星期6和尚2挑水    星期7和尚7挑水        方案4:        星期1和尚5挑水        星期2和尚6挑水    星期3和尚7挑水    星期4和尚1挑水    星期5和尚4挑水    星期6和尚2挑水    星期7和尚3挑水    共有4种方案    问题分析:        与八皇后问题相似。 *//*         为了方便,不使用首元素        */#include <iostream>using namespace std;const int MonkCount = 7;                        // 和尚个数以及星期 bool DayMark[MonkCount+1];                      // 用以标记星期c 是否已经安排和尚r     (从星期1-星期7)int  WorkChart[MonkCount+1];                    // 工作表 下标为 星期c  值为第r位和尚 (从和尚1-和尚7)int  Count;                                     // 方案数 void ShowChart();                               // 显示工作表 void Search(int (*Chart)[MonkCount+1],int r);   // 绘制工作表 int main(){    int i,j;    int MonkTime[MonkCount+1][MonkCount+1] = {0};   // 和尚空闲日     Count = 0;                                  // 初始化方案数为0     for(i=0;i<=MonkCount;i++)                   // 初始化标记数组 皆为 false     {                                           // 初始化工作表皆为 0         DayMark[i] = false;                             WorkChart[i] = 0;    }    for(i=1;i<=MonkCount;i++)                   // 输入和尚空闲日     {        cout<<"请输入和尚 "<<i<<" 的空闲时间:";        for(j=1;j<=MonkCount;j++)        {            cin>>MonkTime[i][j];        }    }    Search(MonkTime,1);                         // 从第1个和尚开始     cout<<endl<<"总计有 "<<Count<<" 种方案."<<endl;    return 0;}// 显示工作表 void ShowChart(){    int i;    cout<<"方案 "<<++Count<<":"<<endl;    for(i=1;i<=MonkCount;i++)    {        cout<<"星期"<<i<<" 和尚"<<WorkChart[i]<<"挑水"<<endl;    }}// 绘制工作表 void Search(int (*Chart)[MonkCount+1], int r){    if(r>MonkCount)                             // 当计算完和尚7后,直接打印     {        ShowChart();    }    int c;    for(c=1;c<=MonkCount;c++)                   // 从星期一开始     {                                           // 判断星期c是否还没有设置和尚 并且 对应的和尚r在星期c是否有空         if(DayMark[c]==false && Chart[r][c]==1)        {            DayMark[c] = true;                  // 通过判断,则在星期c安排和尚r工作             WorkChart[c] = r;            Search(Chart,r+1);                  // 安排和尚r+1的工作             DayMark[c] = false;                 // 安排完毕,取消星期c的安排         }    }}
0 0
原创粉丝点击