八皇后问题实现
哈哈,经典的回溯法问题,以前都是看别人写,今天自己写了下,呼呼
算法回溯部分
将尝试移动第7列的另外一点,以为第8个皇后在第八列寻找一个合适的位置.
如果第7个列找不到合适的位置而无法移动,那么算法就必须去掉它然后回溯到第6列的皇后
最终算法不断重复着摆放皇后和回溯的过程直找到问题为止
#include <iostream>
#include<conio.h>
using namespace std;
//用queens[]数组储存每个皇后的位置
#define Max 8
int sum = 0;
class QueenPuzzle
{
int queens[Max];
public:
void printout();
int IsVaild(int n);//判断第n个皇后放上去以后,是否合法
void PlaceQueen(int i);
};
void QueenPuzzle::printout()
{
for (int i=0;i<Max;i++)
{
for (int j=0;j<Max;j++)
{
if (j==queens[i])
cout<<"■";
else
cout<<"□";
}
cout<<endl;
}
cout<<"按q键退出,按其他键继续"<<endl<<endl;
if(getch()=='q')
exit(0);
}
void QueenPuzzle::PlaceQueen(int i)
{
for(int j=0;j<Max;j++)
//如果全部放完输出结果;
{
if (i==Max)
{
sum++;
cout<<"第"<<sum<<"组解"<<endl;
printout();
return;
}
//放置皇后
queens[i] = j;
//判断下一位置能放皇后不
if (IsVaild(i))
{
PlaceQueen(i+1);
}
}
}
//判断皇后放上去是否合法,是否无冲突
int QueenPuzzle::IsVaild(int n)
{
//将第n个皇后与第n+1个皇后进行比较
for (int i=0;i<n;i++)
{
if (queens[i]==queens[n])
return 0;
if(abs(queens[i]-queens[n])==(n-i))
return 0;
}
return 1;
}
int main()
{
QueenPuzzle queen;
queen.PlaceQueen(0);
cout<<"共有"<<sum<<"组解"<<endl;
return 0;
}
递归可以说是一把双刃剑,正确使用运用递归能够写出逻辑清晰,可读性强的代码.
评论