python深度优先算法 八皇后_八皇后问题——DFS(深度优先搜索)

八皇后问题,是在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法?

算法思路:

八皇后问题实质为一种深度优先(DFS)搜索问题。

可分为两个子函数来解决该问题。第一个子函数用于在棋盘上放置皇后。第二个子函数用于检查摆放过程中有没有违反放置规则。

实际运行过程,为放置第一层上的皇后,进入下一层然后先对上一层检查,合法则进行下一行的放置。反之则退出递归调用,将非法行上的皇后移位。

算法具体描述:

放置皇后函数void Queen_Move(int i);

void Queen_Move(int i)

{

int m = 0;//每行放置的格子位置

if (i == 8)//弹出递归的条件(放完了第8行)和打印结果;

{

map++;//总的放置方法个数

cout << "Queens Location :" << map << endl;

Print();//打印函数

return;}

for (m = 0; m < 8; m++)//一行有八个格子,循环八次

{

if (Check(i,m) == 1)//检验上一次摆放合法后进入

{

Board[i][m] = 1;//放置皇后

Queen_Move(i + 1);//进入下一层放置皇后

Board[i][m] = 0;//进入递归下一层后,清除上一层数据,发现错误后正确进入下一个格子

}

}

}

检查摆放合法函数:int Check(int k, int j)

int Check(int k, int j)

{

//由于以行为单位进行递归放置,因此不会出现一行中放置多个Queen的情况

for (int i = 0; i < 8; i++) //检查列

{

if (Board[i][j] == 1)

{

return 0;

}

}

for (int i = k - 1, m = j - 1; i >= 0 && m >= 0; i--, m--)

//检查左对角线

{

if (Board[i][m] == 1)

{

return 0;

}

}

for (int i = k - 1, m = j + 1; i >= 0 && m <= 7; i--, m++)

//检查右对角线

{

if (Board[i][m] == 1)

{

return 0;

}

}

return 1;

}

八皇后问题抽象出来的模型,实质为一种以深度为单位进行相关检索的程序设计问题。棋盘的每一层即可被抽象为一层,共八层,从第一层开始寻找,合理进入下一层,并寻找前面摆放是否合法。

你可能感兴趣的:(python深度优先算法,八皇后)