回溯法解決N皇后問題 C語言


問題描述:

       八皇后問題是一個以國際象棋為背景的問題:如何能夠在 8×8 的國際象棋棋盤上放置八個皇后,使得任何一個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行、縱行或斜線上。

回溯法:

       回溯法又稱試探法。回溯法的基本做法是深度優先搜索。即從一條路往前走,能進則進,不能進則退回來,換一條路再試。

源代碼:

#include<stdio.h>
#include<math.h>
int x[9]={0};
bool PLACE(int k)//檢測第k個皇后能否放進棋盤
{
    int i=1;
    while(i<k)
    {
        if(x[i]==x[k]||fabs(x[i]-x[k])==fabs(i-k))
            return false;
        i++;
    }
    return true;
}
void NQUEENS(int n)
{
    int i,k=1; //k為當前行號
    x[1]=0;//x[k]為第k行皇后所放的列號
    while(k>0)
    {
        x[k]++;
        while(x[k]<=n&&!PLACE(k))//該行不符合,則放入下一行
          x[k]++;
        if(x[k]<=n)
        {
            if(k==n)//輸出x[]
            {
                for(i=1;i<=n;i++)
                    printf("x[%d]:%d  ",i,x[i]);
                printf("\n");
            }

            else//判斷下一行
            {
                k++; x[k]=0;
            }
        }
        else k--;//沒找到,則回溯
    }
    return ;
}
int main()
{
    NQUEENS(8);
    return 0;
}

 


免責聲明!

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



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