• [华为机试真题][2015]65.和尚挑水


    题目

    某寺庙里7个和尚:轮流挑水,为了和其它任务不能冲突,各人将有空天数列出例如以下表:
    和尚1: 星期二,四;
    和尚2: 星期一,六;
    和尚3: 星期三,日;
    和尚4: 星期五;
    和尚5: 星期一,四,六;
    和尚6: 星期二,五;
    和尚7: 星期三,六,日;
    请将全部合理的挑水时间安排表 
    

    思路 回朔法求解

    回朔法即每进行一步,都试图在当前部分解的基础上扩大该部分解。扩大时,首先检查扩大后是否违反了约束条件,若不违反,则扩大之,然后继续在此基础上依照相似的方法进行。直至成为完整解。若违反。则放弃该步以及它所能生成的部分解,然后依照相似的方法尝试其它可能的扩慷慨式。直到尝试了全部的扩慷慨式。

    请输入和尚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

    代码

    /*---------------------------------------
    *   日期:2015-07-06
    *   作者:SJF0115
    *   题目:和尚挑水
    *   来源:华为机试真题
    -----------------------------------------*/
    #include <iostream>
    #include <string>
    #include <vector>
    #include <stack>
    #include <algorithm>
    using namespace std;
    
    void DrawingWater(vector<vector<int> > &spare,int index,int &count,vector<int> &week,vector<bool> &visited){
        int i;
        if(index == 7){
            ++count;
            cout<<"方案"<<count<<endl;
            for(i = 0; i < 7;++i){
                cout<<"星期"<<i+1<<"   和尚"<<week[i]+1<<"   挑水"<<endl;
            }//for
            cout<<endl;
            return;
        }//if
        for(i = 0;i < 7;++i){
            week[index] = i;
            // 推断和尚j是否已经挑过水及和尚星期n是否有空
            if(!visited[i] && spare[i][index] == 1){
                    visited[i] = true;
                    DrawingWater(spare,index+1,count,week,visited);
                    visited[i] = false;
            }//if
        }//for
    }
    
    int main(){
        vector<vector<int> > spare(7,vector<int>(7,0));
        //freopen("C:\Users\Administrator\Desktop\acm.txt","r",stdin);
        for(int i = 0;i < 7;++i){
            // 初始化和尚的空暇时间
            for(int j = 0;j < 7;++j){
                cin>>spare[i][j];
            }//for
        }//for
        int count = 0;
        vector<int> week(7,0);
        vector<bool> visited(7,false);
        DrawingWater(spare,0,count,week,visited);
        cout<<"总共"<<count<<"种方案"<<endl;
        return 0;
    }
    
  • 相关阅读:
    vim编辑器
    centos7启动顺序加密的问题
    centos7进入单用户模式
    centos7修改默认运行级别的变化
    C#构建DataTable(转)
    策略模式简介
    简单工厂模式(转)
    NPOI导Excel样式设置(转)
    VS2012启用angularjs智能提示Intelligence
    WebForm页面间传值方法(转)
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/7190324.html
Copyright © 2020-2023  润新知