资源简介
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)
{
- 上一篇:C++编写的有界面的扫雷游戏
- 下一篇:大富翁游戏源码
评论
共有 条评论