天天看點

n皇後 回溯遞歸

#include <iostream>

#include <cstring>

#include <math.h>

using namespace std;

void queen(int row , int* c);        //遞歸回溯本體

int is_true(int row , int* c);    //判斷是否目前旗子擺放符合條件

int n , total = 0;

int main()

{

   cin>>n;

   int c[n];         //初始化數組

   //因為每一行隻能有一個旗子,是以用一維數組儲存列資訊

   queen(0,c);

   cout<<total;

   return 0;

}

int is_true(int row , int* c)

{

    for(int i = 0 ; i < row ; i++)

    {

        if(c[i]==c[row]||i-c[i]==row-c[row]||i+c[i]==row+c[row])  //若在同一條對角線上則數組中旗子的角标元素在x+y或x-y的直線上

            return 0;

    }

    return 1;

}

void queen(int row , int* c)

{

    if(row==n)

        total++;

    else

    {

        for(int col = 0 ; col < n ; col++)   //從第一列周遊到最後一列

        {

            c[row] = col;

            if(is_true(row , c))

                queen(row+1,c);

        }

    }

}

參考:https://www.cnblogs.com/bigmoyan/p/4521683.html

繼續閱讀