⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 river.cpp

📁 在VC的环境下
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <stdlib.h>
#include <iostream.h>

class CRiver
{
public:
	enum{LEFT_BANK = 1, RIGHT_BANK = 0};
	enum{CHUCHMEN = 0, GOTH = 1};
	friend ostream & operator << (ostream & Out, CRiver river);
	bool L01();
	bool L10();
	bool L11();
	bool L02();
	bool L20();
	bool R01();
	bool R10();
	bool R11();
	bool R02();
	bool R20();
	bool Compare(const CRiver & riverDet);
	CRiver(const CRiver & pSrc);
	CRiver();
	virtual ~CRiver();
	int m_nShipPos;
	int m_nChuchmenAndGoth[2][2];
	CRiver * m_pParent;
	CRiver * m_pNextStep;
protected:
private:
};

CRiver::CRiver()
{
	int i = 0;

	m_nShipPos = LEFT_BANK;
	m_pParent = NULL;
	m_pNextStep = NULL;
	for (i=0; i<2; i++)
	{
		m_nChuchmenAndGoth[LEFT_BANK][i] = 3;
		m_nChuchmenAndGoth[RIGHT_BANK][i] = 0;
	}
}

CRiver::~CRiver()
{

}

ostream & operator << (ostream & Out, CRiver river)
{
//	int nShipPos = 0;
//	if (CRiver::LEFT_BANK == river.m_nShipPos)
//	{
//		nShipPos = 1;
//	}
	
	Out<<"(m, c, b): ";
	Out<<"(";
	Out<<river.m_nChuchmenAndGoth[CRiver::LEFT_BANK][CRiver::CHUCHMEN]<<", ";
	Out<<river.m_nChuchmenAndGoth[CRiver::LEFT_BANK][CRiver::GOTH]<<", ";
	Out<<river.m_nShipPos<<")";

	return Out;
}

bool CRiver::Compare(const CRiver & riverDet)
{
	int i = 0;
	int j = 0;

	if (m_nShipPos != riverDet.m_nShipPos)
	{
		return false;
	}

	for (i=0; i<2; i++)
	{
		for (j=0; j<2; j++)
		{
			if (m_nChuchmenAndGoth[i][j] != riverDet.m_nChuchmenAndGoth[i][j])
			{
				return false;
			}
		}
	}

	return true;
}

CRiver::CRiver(const CRiver & pSrc)
{
	int i = 0;
	int j = 0;

	m_pParent = pSrc.m_pParent;
	m_nShipPos = pSrc.m_nShipPos;

	for (i=0; i<2; i++)
	{
		for (j=0; j<2; j++)
		{
			m_nChuchmenAndGoth[i][j] = pSrc.m_nChuchmenAndGoth[i][j];
		}
	}
}

bool CRiver::L01()
{
	CRiver oldRiver = *this;
	
	if (LEFT_BANK == m_nShipPos
		&& m_nChuchmenAndGoth[LEFT_BANK][GOTH] >= 1
		&& 0 == (m_nChuchmenAndGoth[LEFT_BANK][CHUCHMEN] % 3))
	{
		m_nShipPos = RIGHT_BANK;
		m_nChuchmenAndGoth[LEFT_BANK][GOTH]--;
		m_nChuchmenAndGoth[RIGHT_BANK][GOTH]++;
		
		if (NULL != m_pParent)
		{
			if (Compare(*m_pParent)
				&& m_nShipPos == m_pParent->m_nShipPos)
			{
				*this = oldRiver;
				return false;
			}
		}

		return true;
	}

	return false;
}

bool CRiver::L10()
{
	CRiver oldRiver = *this;

	if (LEFT_BANK == m_nShipPos
		&& ((2==m_nChuchmenAndGoth[LEFT_BANK][GOTH] && 3==m_nChuchmenAndGoth[LEFT_BANK][CHUCHMEN]) 
		|| (1==m_nChuchmenAndGoth[LEFT_BANK][GOTH] && 1==m_nChuchmenAndGoth[LEFT_BANK][CHUCHMEN])))
	{
		m_nShipPos = RIGHT_BANK;
		m_nChuchmenAndGoth[LEFT_BANK][CHUCHMEN]--;
		m_nChuchmenAndGoth[RIGHT_BANK][CHUCHMEN]++;

		if (NULL != m_pParent)
		{
			if (Compare(*m_pParent)
				&& m_nShipPos == m_pParent->m_nShipPos)
			{
				*this = oldRiver;
				return false;
			}
		}

		return true;
	}

	return false;
}

bool CRiver::L11()
{
	CRiver oldRiver = *this;

	if (LEFT_BANK == m_nShipPos
		&& m_nChuchmenAndGoth[LEFT_BANK][CHUCHMEN] >= 1 
		&& (m_nChuchmenAndGoth[LEFT_BANK][GOTH] == m_nChuchmenAndGoth[LEFT_BANK][CHUCHMEN]))
	{
		m_nShipPos = RIGHT_BANK;
		m_nChuchmenAndGoth[LEFT_BANK][CHUCHMEN]--;
		m_nChuchmenAndGoth[RIGHT_BANK][CHUCHMEN]++;
		m_nChuchmenAndGoth[LEFT_BANK][GOTH]--;
		m_nChuchmenAndGoth[RIGHT_BANK][GOTH]++;

		if (NULL != m_pParent)
		{
			if (Compare(*m_pParent)
				&& m_nShipPos == m_pParent->m_nShipPos)
			{
				*this = oldRiver;
				return false;
			}
		}
		
		return true;
	}

	return false;
}

bool CRiver::L02()
{
	CRiver oldRiver = *this;
	
	if (LEFT_BANK == m_nShipPos
		&& m_nChuchmenAndGoth[LEFT_BANK][GOTH] >= 2 
		&& 0 == (m_nChuchmenAndGoth[LEFT_BANK][CHUCHMEN] % 3))
	{
		m_nShipPos = RIGHT_BANK;
		m_nChuchmenAndGoth[LEFT_BANK][GOTH] = m_nChuchmenAndGoth[LEFT_BANK][GOTH] - 2;
		m_nChuchmenAndGoth[RIGHT_BANK][GOTH]= m_nChuchmenAndGoth[RIGHT_BANK][GOTH] + 2;

		if (NULL != m_pParent)
		{
			if (Compare(*m_pParent)
				&& m_nShipPos == m_pParent->m_nShipPos)
			{
				*this = oldRiver;
				return false;
			}
		}

		return true;
	}

	return false;
}

bool CRiver::L20()
{
	CRiver oldRiver = *this;

	if (LEFT_BANK == m_nShipPos
		&& ((2==m_nChuchmenAndGoth[LEFT_BANK][GOTH] && 2==m_nChuchmenAndGoth[LEFT_BANK][CHUCHMEN]) 
		|| (1==m_nChuchmenAndGoth[LEFT_BANK][GOTH] && 3==m_nChuchmenAndGoth[LEFT_BANK][CHUCHMEN])))
	{
		m_nShipPos = RIGHT_BANK;
		m_nChuchmenAndGoth[LEFT_BANK][CHUCHMEN] = m_nChuchmenAndGoth[LEFT_BANK][CHUCHMEN] - 2;
		m_nChuchmenAndGoth[RIGHT_BANK][CHUCHMEN]= m_nChuchmenAndGoth[RIGHT_BANK][CHUCHMEN] + 2;

		if (NULL != m_pParent)
		{
			if (Compare(*m_pParent)
				&& m_nShipPos == m_pParent->m_nShipPos)
			{
				*this = oldRiver;
				return false;
			}
		}

		return true;
	}

	return false;
}

bool CRiver::R01()
{
	CRiver oldRiver = *this;
	
	if (RIGHT_BANK == m_nShipPos
		&& m_nChuchmenAndGoth[RIGHT_BANK][GOTH] >= 1
		&& 0 == (m_nChuchmenAndGoth[RIGHT_BANK][CHUCHMEN] % 3))
	{
		m_nShipPos = LEFT_BANK;
		m_nChuchmenAndGoth[RIGHT_BANK][GOTH]--;
		m_nChuchmenAndGoth[LEFT_BANK][GOTH]++;

		if (NULL != m_pParent)
		{
			if (Compare(*m_pParent)
				&& m_nShipPos == m_pParent->m_nShipPos)
			{
				*this = oldRiver;
				return false;
			}
		}

		return true;
	}

	return false;
}

bool CRiver::R10()
{
	CRiver oldRiver = *this;

	if (RIGHT_BANK == m_nShipPos
		&& ((2==m_nChuchmenAndGoth[RIGHT_BANK][GOTH] && 3==m_nChuchmenAndGoth[RIGHT_BANK][CHUCHMEN]) 
		|| (1==m_nChuchmenAndGoth[RIGHT_BANK][GOTH] && 1==m_nChuchmenAndGoth[RIGHT_BANK][CHUCHMEN])))
	{
		m_nShipPos = LEFT_BANK;
		m_nChuchmenAndGoth[RIGHT_BANK][CHUCHMEN]--;
		m_nChuchmenAndGoth[LEFT_BANK][CHUCHMEN]++;

		if (NULL != m_pParent)
		{
			if (Compare(*m_pParent)
				&& m_nShipPos == m_pParent->m_nShipPos)
			{
				*this = oldRiver;
				return false;
			}
		}

		return true;
	}

	return false;
}

bool CRiver::R11()
{
	CRiver oldRiver = *this;
	
	if (RIGHT_BANK == m_nShipPos
		&& m_nChuchmenAndGoth[RIGHT_BANK][CHUCHMEN] >= 1 
		&& (m_nChuchmenAndGoth[RIGHT_BANK][GOTH] == m_nChuchmenAndGoth[RIGHT_BANK][CHUCHMEN]))
	{
		m_nShipPos = LEFT_BANK;
		m_nChuchmenAndGoth[RIGHT_BANK][CHUCHMEN]--;
		m_nChuchmenAndGoth[LEFT_BANK][CHUCHMEN]++;
		m_nChuchmenAndGoth[RIGHT_BANK][GOTH]--;
		m_nChuchmenAndGoth[LEFT_BANK][GOTH]++;

		if (NULL != m_pParent)
		{
			if (Compare(*m_pParent)
				&& m_nShipPos == m_pParent->m_nShipPos)
			{
				*this = oldRiver;
				return false;
			}
		}

		return true;
	}

	return false;
}

bool CRiver::R02()
{
	CRiver oldRiver = *this;

	if (RIGHT_BANK == m_nShipPos
		&& m_nChuchmenAndGoth[RIGHT_BANK][GOTH] >= 2 
		&& 0 == (m_nChuchmenAndGoth[RIGHT_BANK][CHUCHMEN] % 3))
	{
		m_nShipPos = LEFT_BANK;
		m_nChuchmenAndGoth[RIGHT_BANK][GOTH] = m_nChuchmenAndGoth[RIGHT_BANK][GOTH] - 2;
		m_nChuchmenAndGoth[LEFT_BANK][GOTH]= m_nChuchmenAndGoth[LEFT_BANK][GOTH] + 2;

		if (NULL != m_pParent)
		{
			if (Compare(*m_pParent)
				&& m_nShipPos == m_pParent->m_nShipPos)
			{
				*this = oldRiver;
				return false;
			}
		}

		return true;
	}

	return false;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -