八皇后问题——回溯深搜

回溯法解决八皇后问题

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

《八皇后问题——回溯深搜》
《八皇后问题——回溯深搜》
View Code

#include<iostream>
using namespace std;

int pos[8]; //记录第i行上的皇后所在的列号
int cnt;

bool cango(int row, int col)
{
//在第row行第col列放皇后时,检查其与前row-1行的皇后是否有攻击
for(int i = 0; i < row; i ++){
int j = pos[i];
if(j == col){ //检查列
return false;
}
if(i + j == row + col){ //检查从对角线
return false;
}
if(i - j == row - col){ //检查主对角线
return false;
}
}
return true;
}

void print()
{
for(int i = 0; i < 8; i ++){
for(int j = 0; j < pos[i]; j ++){ //第i行上不放皇后的位置用'-'表示
cout << '-';
}
cout << '*'; //i行上不放皇后的位置用'*'表示
for(int j = pos[i] + 1; j < 8; j ++){
cout << '-';
}
cout << endl;
}
return ;
}

void eight_queen(int i)
{
//在第i行放皇后
for(int j = 0; j < 8; j ++){ //有攻击,则将第i行上的皇后右移一个位置
if(cango(i, j)){ //无攻击
pos[i] = j;
if(i == 7){ //无攻击时,若该皇后是最后一行,则说明已经找到了八个皇后互不攻击的一个布局
cnt ++; //方案数加1
print(); //输出该布局
pos[i] = (j + 1) % 8; //将第n行上的皇后右移一个位置,重新进行这个过程
return ;
}
eight_queen(i + 1); //无攻击时,若该皇后不是最后一行,则考虑安排下一行上的皇后位置
}
}
}

int main()
{
cnt = 0;
eight_queen(0);
cout << cnt << endl;
system("pause");
}

下面用典型的深搜方法来解八皇后问题(不输出布局)

《八皇后问题——回溯深搜》
《八皇后问题——回溯深搜》
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");
}

    原文作者:爱也玲珑
    原文地址: https://www.cnblogs.com/aiyelinglong/archive/2012/03/22/2411884.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞