八皇后问题

来源:互联网 发布:大数据关联分析 编辑:程序博客网 时间:2024/05/16 13:46

八皇后问题是在8*8的棋盘上放置8枚皇后,使得棋盘中每个纵向、横向、左上至右下斜向、右上至左下斜向均只有一枚皇后。八皇后的一个可行解如图所示:


思路:

对于八皇后的求解可采用回溯算法,从上至下依次在每一行放置皇后,进行搜索,若在某一行的任意一列放置皇后均不能满足要求,则不再向下搜索,而进行回溯,回溯至有其他列可放置皇后的一行,再向下搜索,直到搜索至最后一行,找到可行解,输出。

可以使用递归函数实现上述回溯算法,递归函数用于求解在某一行放置皇后,具体代码如下所示。

#include <iostream>using namespace std;int queen[8][8] = {0};int resultNum = 0;bool Check(int row, int column);   //判断当第row-1行放置好皇后后,第row行的第column列能否放置皇后void Solve(int row);               //解决第row行的皇后放置问题void PrintResult();                //打印结果int main(){    Solve(1);    return 0;}bool Check(int row, int column)   //判断当第row-1行放置好皇后后,第row行的第column列能否放置皇后{    int i, j;    if(row == 1)            //第一行的任何一列都可以放置皇后        return true;    //如果在第1行到第n-1行的column列上放置有皇后,则在第row行第column列上就不能放置皇后    for(i=0; i<row-1; i++)    {        if(queen[i][column-1] == 1)            return false;    }    //如果在第row行第column列的左上对角线上有皇后,则在第row行第column列上就不能放置皇后    //i = row -1;    //j = column - 1;    i = row-2;    j = i-(row-column);    while(i>=0 && j>=0)    {        if(queen[i][j] == 1)            return false;        i--;        j--;    }    //如果在第row行第column列的右上对角线上有皇后,则在第row行第column列上就不能放置皇后    //i = row -1;    //j = column + 1;    i = row-2;    j = row+column-i-2;    while(i>=0 && j<=7)    {        if(queen[i][j] == 1)            return false;        i--;        j++;    }    return true;}void Solve(int row)         //解决第row行的皇后放置问题{    int j;   //j扫描列    for(j=0; j<8; j++)    {        queen[row-1][j] = 1;   //在第row行,第j+1列上放置皇后,看是否可行        if(Check(row, j+1) == true)    //为true,说明在第row行,第j+1列上可以放置皇后        {            if(row == 8)            //row为8,说明已经解决到了最后一行,直接打印结果                PrintResult();            else                    //else的情况为还没到第8行,继续解决下一行,即第row+1行                Solve(row + 1);        }        queen[row-1][j] = 0;        //取出该列的皇后,进行回溯,在其他列放置皇后    }}void PrintResult()         //打印结果{    resultNum++;    cout << "Answer " << resultNum << ": " << endl;    for(int i=0; i<8; i++)    {        for(int j=0; j<8; j++)            cout << queen[i][j] << " ";        cout << endl;    }}


0 0
原创粉丝点击