📄 river.cpp
字号:
#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 + -