八皇后问题,是在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;
}

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


WildDuck
0 声望1 粉丝

引用和评论

0 条评论