八皇后問題(遞歸方法詳解)


八皇后遞歸詳解

核心代碼如下:

//八皇后遞歸解法
#include<iostream>
using namespace std;

int queen[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
int count = 0;//定義一個全局變量
bool available(int pointi,int pointj) //判斷某個皇后是否與已有皇后沖突
{
    for(int i = 1; i<pointi; i++)
    {
        if(pointj == queen[i])
            return false;//同一列拒絕
        if((pointi-i) == (pointj-queen[i]))
            return false;//同一主對角線拒絕
        if((pointi-i) + (pointj-queen[i]) == 0)
            return false;//同一副對角線拒絕
    }
    return true;
}
void findSpace(int queenNumber) //在第queenNumber行找能放皇后的位置
{
//因為行數在遞歸中不斷調用(即行數在遞歸一次取下一行),所以只要遍歷列的位置
    for(int i = 1; i<9; i++) //從1~8遍歷這一行的八個空位
    {
        if(available(queenNumber,i))
        {
//如果可以放這個位置就記錄下第queenNumber個皇后的位置
            queen[queenNumber] = i;
            if(queenNumber == 8) //如果八個皇后都放滿了統計一下
            {
                count++;//次數就增加一次
                return;
            }
            int nextNumber = queenNumber+1;//還有皇后沒放遞歸放下一個皇后(取下一行)
            findSpace(nextNumber);//遞歸
        }
    }
    queen[--queenNumber] = -1;//如果這一行沒有可放的位置說明上一行皇后放的位置不行,要為上一個皇后尋找新的可放位置(即就要重新再找一次)
    return;
}
int main()
{
    findSpace(1);//從(1,1)開始遞歸好理解
    cout << count << endl;
    return 0;
}
View Code

八皇后問題可以不只是限制於八個皇后,可以推廣到n皇后問題,下期介紹。

//八皇后遞歸解法(C語言寫法)

//#include<iostream>
//using namespace std;
#include<stdio.h>

int queen[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
int count = 0;//定義一個全局變量
bool available(int pointi,int pointj) //判斷某個皇后是否與已有皇后沖突
{
    for(int i = 1; i<pointi; i++)
    {
        if(pointj == queen[i])
            return false;//同一列拒絕
        if((pointi-i) == (pointj-queen[i]))
            return false;//同一主對角線拒絕
        if((pointi-i) + (pointj-queen[i]) == 0)
            return false;//同一副對角線拒絕
    }
    return true;
}
void findSpace(int queenNumber) //在第queenNumber行找能放皇后的位置
{
//因為行數在遞歸中不斷調用(即行數在遞歸一次取下一行),所以只要遍歷列的位置
    for(int i = 1; i<9; i++) //從1~8遍歷這一行的八個空位
    {
        if(available(queenNumber,i))
        {
//如果可以放這個位置就記錄下第queenNumber個皇后的位置
            queen[queenNumber] = i;
            if(queenNumber == 8) //如果八個皇后都放滿了統計一下
            {
                count++;//次數就增加一次
                return;
            }
            int nextNumber = queenNumber+1;//還有皇后沒放遞歸放下一個皇后(取下一行)
            findSpace(nextNumber);//遞歸
        }
    }
    queen[--queenNumber] = -1;//如果這一行沒有可放的位置說明上一行皇后放的位置不行,要為上一個皇后尋找新的可放位置(即就要重新再找一次)
    return;
}
int main()
{
    findSpace(1);//從(1,1)開始遞歸好理解
    //cout << count << endl;
    printf("%d\n",count);
    return 0;
}
C寫法

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM