• 大小: 7KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-05-12
  • 语言: C/C++
  • 标签:

资源简介

1)实验准备 要实验的Windows下的多线程实验,应做如下准备: a) 在新建中选”Win32 Console Application”->An empty project b) 选”工程”->”设置”选项,在”设置”中选择“C/C++”标签,在”Project Option”中,将”MLd”参数改成“MTd”(如图1-1)

资源截图

代码片段和文件信息

#include
#include
#include
#include
#include
 
using namespace std;
 
// 过河者,共4种对象
enum Wader
{
    cabbage        // 默认为0
    goat            // 默认为1
    wolf            // 默认为2
    farmer            // 默认为3   
};
 
// 过河状态类型,4bit分别对应4种过河对象
typedef bitset<4> bitvec;
 
// 判断状态是否安全
bool is_safe( const bitvec&);
// 判断待过河的对象是否与农夫在河的同一侧
bool withFarmer(int bitvec& );
 
// 求解得到可行性路径
void findRoute(vector & path)
{
    // 待发现的各个状态
    queue discovering;   
    // 过河的初始状态为 0000
    discovering.push(0x00);   
    // 初始状态路径初始化
    path[0]=0;
    // 只要还有下一个状态可以到达,并且尚未到达最终状态
    while (!discovering.empty() && (path[15] == -1))
    {   
        // 获取当前待发现状态
        // 隐式类型转换:int -> bitset<4>
        bitvec curState = discovering.front();
        // 队首元素弹出
        discovering.pop();
        // 农夫到河对岸,伴随农夫的对象
        // 依次尝试狼、白菜、羊
        for (int companion = 0; companion <= 3; ++companion)   
        {
            // 随农夫过河的只能是与农夫在同一河边的
            if (withFarmer(companioncurState))
            {
                // 农夫过河后的新状态
                bitvec nextState = curState;
                // 农夫必定过河
                nextState.flip(farmer);
                // 如果不是农夫单独过河的情形
                if(companion != farmer)                   
                    nextState.flip(companion);
                // 将状态矢量转换为整型以作为队列元素和路径下标
                int nextIndex = nextState.to_ulong();
                // 如果新状态是安全的,并且尚未被发现,
                // 则新状态进入下一状态队列
                if (is_safe(nextState) && ( path[nextIndex] == -1) )
                {
                    // 建立当前状态与下一状态的联系
                    path[nextIndex] = curState.to_ulong();
                    // 将新状态入对列
                    discovering.push(nextIndex);
                }//end if
            }// end if
        }//end for
    }// end while
    // 状态起点,没有前驱,设为-1;
    //path[0] = -1;
}
 
// 显示实际方案
// 从抽象状态变量转换为具体表达
void displayRoute(const vector& path)
{
    // 如果“1111”状态没有前驱
    // 则没能够成功到达目的状态
    if (path[15] == -1)
    {
      

评论

共有 条评论

相关资源