zoukankan      html  css  js  c++  java
  • [华为机试真题][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;
    }
    
  • 相关阅读:
    n皇后问题
    几种NFS系统对比,选型理由
    MooseFs集群故障恢复运维
    TB级NFS数据平滑迁移方案设计与实现
    NFS挂载各机显示用户不同的问题
    TB级NFS数据平滑迁移系列
    mysql备份和恢复
    Java基础赋值符号
    java 流程控制基础之if else
    Java基础赋值符号
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/7190324.html
Copyright © 2011-2022 走看看