您的位置:首页 > 其它

八皇后问题——回溯深搜

2012-03-22 16:44 337 查看
回溯法解决八皇后问题

回溯发的步骤:
从第一行开始进行,设前i-1行上的皇后已经布局好,互不攻击。现考虑第i行上的皇后的位置,
使之与前i-1行上的皇后也都互不攻击。
(1)检查第i行上的皇后与前i-1行的皇后是否互不攻击。若有攻击,则将第i行上的皇后右移一个位置,
重新进行这个过程;若无攻击,则考虑安排下一行上的皇后位置。
(2)若安排好的皇后是最后一行,则说明已经找到了8个皇后互不攻击的一个布局,将这个布局输出,
然后将该行上的皇后右移一个位置,重新进行这个过程,以便寻找下一个布局。

View Code

#include<iostream>
using namespace std;

bool rvisit[8];
bool cvisit[8];
bool dialvisit[15];
bool adialvisit[15];

int sheme;

void dfs(int i, int ct)
{
if(ct == 8){
sheme ++;
return ;
}
if(i >= 8){
return ;
}
dfs(i + 1, ct);
for(int j = 0; j < 8; j ++){
if(!rvisit[i] && !cvisit[j] && !dialvisit[i + j] && !adialvisit[i - j + 7]){
rvisit[i] = true;
cvisit[j] = true;
dialvisit[i + j] = true;
adialvisit[i - j + 7] = true;
dfs(i + 1, ct + 1);
rvisit[i] = false;
cvisit[j] = false;
dialvisit[i + j] = false;
adialvisit[i - j + 7] = false;
}
}

}

int main()
{
memset(rvisit, false, sizeof(rvisit));
memset(cvisit, false, sizeof(cvisit));
memset(dialvisit, false, sizeof(dialvisit));
memset(adialvisit, false, sizeof(adialvisit));
sheme = 0;
dfs(0, 0);
cout << sheme << endl;
system("pause");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: