簡單回溯N皇后問題

//回溯法,從第0行開始擺放皇后,後面每次把皇后擺放到第curRow行i位置時,
//就判斷是否和前面已經擺放好了的皇后衝突
//vis[curRow]=i表示嘗試把第curRow行的皇后擺放到第i列
//判斷行列對角線衝突方法:
//vis[curRow]==vis[j]則列衝突
//curRow+(-)vis[curRow]==j+(-)vis[curRow]則對角線衝突
#include <stdio.h>
#define N 12
int total;
int vis[N]={0};
void search(int curRow)
{
    int i,j;
    //已經擺放好了N個皇后,則解法+1
    if(curRow==N) total++;
    else for(i=0;i<N;i++)
    {
        int flag=0;
        vis[curRow]=i;
        for(j=0;j<curRow;j++)
        {
            //衝突檢測
            if(vis[curRow]==vis[j] || curRow-vis[curRow]==j-vis[j] || curRow+vis[curRow]==j+vis[j])
            {
                flag=1;
                break;
            }
        }
        if(!flag) search(curRow+1);
    }
}

int main()
{
    total=0;
    search(0);
    printf("%d",total);
    return 0;
}

其實還是借鑑的劉汝佳的方法。注意,當N>12時程序效率變得低下,所以需要再做改進。

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