N皇后問題—初級回溯

N皇后問題,最基礎的回溯問題之一,題意簡單N*N的正方形格子上放置N個皇后,任意兩個皇后不能出如今同一條直線或者斜線上,求不一樣N對應的解。ios

提要:N>13時,數量龐大,初級回溯只能保證在N<=13的狀況下快速得出答案,重點是數組cur[],表示的是第幾行上放的皇后在第幾列上,好比cur[1]=2;數組

表示第一行中的皇后已經放置,且在第一行的第二列上、而後用兩個函數判斷是否共線、下面是代碼...ide

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cstring>
using namespace std;
int cur[16];
int real(int i,int j)//求i-j的絕對值
{
    if (i>j) return i-j;
    else return j-i;
}
int buzaitongyiahang(int i,int j) // 判斷不在同一行
{
    for (int k=1; k<i; k++)
        if (cur[k]==j) return 0;
    return 1;
}
int notxie(int i,int j)    //判斷不在一條斜線上
{
    for (int k=1; k<i; k++)
        if (real(i,k)==real(j,cur[k])) return 0;
    return 1;
}
int putque(int n,int i)
{
    int ans=0;
    int j;
    if (i==1)
    {
        for (j=1; j<=n; j++)
        {
            cur[i]=j;
            ans+=putque(n,2);
            cur[i]=-1;
        }
    }
    else if (i==n)
    {
        for (j=1; j<=n; j++)
            if (putque(i,j)&&notxie(i,j))
            {
                cur[i]=j;
                return 1;
            }
    }
    else
    {
        for (j=1; j<=n; j++)
            if (buzaitongyiahang(i,j)&&notxie(i,j))
            {
                cur[i]=j;
                ans+=putque(n,i+1);
                cur[i]=3276;
            }
    }
    return ans;
}

void work(int n)
{
    for (int k=1;k<=15;k++) cur[k]=-1;
    printf("%d\n",putque(n,1));
}
int main()
{
    int T,N;
    scanf("%d",&T);
    while (T--)
    {
        scanf("%d",&N);
        if (N==1) printf("1\n");
        else  work(N);
    }
    return 0;
}
View Code
相關文章
相關標籤/搜索