栈的应用
试探回溯法
1.八皇后问题
皇后类
struct Queen { //皇后类
int x, y; //坐标
Queen (int xx = 0, int yy = 0 ) : x(xx), y(yy) {};
bool operator==( Queen const& q ) const { //重载判等操作符,检验不同皇后之间存在的冲突
return (x==q.x) //行冲突
|| (y==q.y) //列冲突
|| (x+y == q.x+q.y) //对角线冲突
|| (x-y == q.x-q.y);
}
bool operator!=( Queen const& q) const { return !(*this == q); } //重载不等操作符
};
将存在冲突的皇后判作相等
每行仅能放置一个皇后,先见各皇后分配至每一行。逐个尝试着她们放置到无冲突的某列,若当前皇后在任何列都冲突,则回溯到上一个皇后。
N皇后算法:
void placeQueen ( int N ) { //N皇后算法:采用试探/回溯的策略,借助栈记录查找结果
Stack<Queen> solu; //存放解的栈
Queen q(0,0); //原点位置开始
do { //反复试探,回溯
if ( N <= solu.size() || N <= q.y ) {