八皇后問題

八皇后問題是在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;
    }
}


發佈了71 篇原創文章 · 獲贊 16 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章