hdu2553 n皇后問題(純粹回溯法)
阿新 • • 發佈:2019-02-12
#include <iostream> #include <string> #include <stdio.h> #include <algorithm> #include <math.h> //n皇后問題用一維陣列 //例如a[1]=2即代表第一行第二列擺了棋子 //這樣直接排除同列情況 using namespace std; int a[20]; int c[20]; int pd(int a[],int k) { int i; for(i=1; i<=k-1; i++) { if(a[i]==a[k]||abs(i-k)==abs(a[i]-a[k]))//判斷同行 同對角線 { return 0; } } return 1; } int main() { int n,i,k,count=0; for(n=1;n<=10;n++) { count=0; k=1; a[k]=0; while(k!=0) { a[k]++; while(a[k]<=n&&!pd(a,k)) { a[k]++; } if(a[k]>n) k--;//回溯,a[k]的值超過n,回溯到前一行 else { if(k==n) count++; else { k++; a[k]=0; } } } c[n]=count; } while(scanf("%d",&n)&&n) { printf("%d\n",c[n]); } }
用一維陣列去代替二維座標減少了步驟
判斷對角線:abs(x1-x2)==abs(y1-y2)