C++代码(2)八皇后问题(二)

2014-11-24 12:55:10 · 作者: · 浏览: 4
--;
if (m_nLast<=0 && m_QueenPos[0] > m_nQueenCount)
return false;
}
else
{
if (m_nLast+1 == m_nQueenCount)
return true;
m_nLast++;
m_QueenPos[m_nLast] = 0;
}
return Play();
}
代码用m_nLast纪录Play到第几行了。其实这个变量可以省掉的,只要重新再写一个Play的辅助函数PlayHelper,其带有m_nLast的参数,内部递归调用自己。但是,在下写代码的原则是,能少写函数就少写函数,而且用了m_nLast之后,这个程序还有一个新的功能。于是,QueenGame的定义如下。
class QueenGame
{
public:
enum {MAX_QUEEN_COUNT = 10};

QueenGame(int queenCount)
{
assert(queenCount > 0 && queenCount <= MAX_QUEEN_COUNT );
m_nQueenCount = queenCount;
m_nLast = 0;
m_QueenPos[m_nLast] = 0;
}

public:
int GetQueenCount()const
{
return m_nQueenCount;
}
bool Play();

int m_QueenPos[MAX_QUEEN_COUNT];

private:
bool testNewQueen();

int m_nQueenCount;
int m_nLast;
}; 私有函数testNewQueen用以最后的位置是否适合第N个皇后居住,分别从纵向和斜向上予以考察,横向就不用再考虑了,你应该知道WHY的。 bool QueenGame::testNewQueen()
{
int lastPos = m_QueenPos[m_nLast];
for (int i=0; i {
if (m_QueenPos[i] == lastPos || abs(m_QueenPos[i]-lastPos)==(m_nLast-i))
return false;
}
return true;
}
激动人心的一刻来临了,程序终于可以跑起来了。再次审视代码的时候,我们惊喜地发现QueenGame的Play函数可以遍历所有的解,只要将main中的if改成while就可以了,非常棒。这都是坚持分离代码的操作与输出,并序将八皇后问题封装成类所带来的好处。
显然,这里采用了深度优先的搜索算法,代码也可以写成不用递归的形式,还有,这里也可以用宽度优先搜索法,这一切就有待各位尝试了。
又,程序采用了一点点匈牙利的命名习惯,这是MFC用久了所沾染上的恶习,没办法改了,偶也知道匈牙利命名的种种弊端。