八皇后问题DFS深度优先搜索

46次阅读

共计 944 个字符,预计需要花费 3 分钟才能阅读完成。

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

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

正文完
 0