问题:
经典的八皇后问题
分析:
递归解法直观易懂,但是迭代法需要想点思路
代码如下:
/*
* eightQueen.cpp
*
* Created on: 2012-10-14
* Author: happier
*/
#include <iostream>
using namespace std;
#define N 8
int sum = 0;
int *x = new int[N + 1];
bool place(int k)
{
int i;
for (i = 1; i < k; i++)
{
if (x[i] == x[k] || abs(i - k) == abs(x[i] - x[k])) //第一个判断行不能相同,第二个判断对角线不能相同
return false;
}
return true;
}
void backtrack2()//迭代回溯
{
int i;
x[1]=0;
int k=1;
while(k>0)
{
x[k]+=1;//当前列加1的位置开始搜索
while((x[k]<=N) && !place(k))//当前列位置是否满足条件
x[k]+=1;//不满足条件,继续搜索下一个位置
if(x[k]<=N)//存在满足条件的列
{
if(k==N)//是最后一个皇后,完成搜索
{
for(i=1; i<=N; i++)
cout<<x[i]<<" ";
cout<<endl;
sum++;
}
else//不是,则处理下一个皇后
{
k++;
x[k]=0;
}
}
else//回溯
{
k--;
}
}
}
void backtrack(int t) //递归回溯
{
int i = 0;
if (t > N) //递归结束返回
{
for (i = 1; i <= N; i++)
cout << x[i] << " ";
cout << endl;
sum++;
}
else
{
for (i = 1; i <= N; i++)
{
x[t] = i; //选择一个皇后
if (place(t)) //判断第t列,第i行放一个皇后是否合法
backtrack(t + 1);
}
}
}
int main()
{
backtrack(1);
cout << sum << endl;
sum = 0;
backtrack2();
cout << sum << endl;
return 0;
}
总结:
这里迭代法没有用栈去模拟,因为理解了其中的含义,可以写出非递归法,但是本质上还是存在回溯的。