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)&¬xie(i,j)) { cur[i]=j; return 1; } } else { for (j=1; j<=n; j++) if (buzaitongyiahang(i,j)&¬xie(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; }