廣度優先搜尋和深度優先搜尋—N皇后問題
阿新 • • 發佈:2019-02-01
1.遞歸回溯法
原始碼:
#include <stdio.h> #include <math.h> #define N 15 int x[N]; //皇后放置的列數 int n; //皇后個數 int sum=0; //可行解個數 int place(int k) { int i; for(i=1;i<k;i++) if(abs(k-i)==abs(x[k]-x[i])||x[k]==x[i]) return 0; return 1; } int queen(int k) { int i; if(k>n) sum++; else for(i=1;i<=n;i++) { x[k]=i; if(place(k)) queen(k+1); } return sum; } int main() { printf("Please input n:(n<15)"); scanf("%d",&n); printf("%d\n",queen(1)); return 0; }
2.迭代回溯法
原始碼:
#include <stdio.h> #include <math.h> #define N 15 int n; int sum=0; int x[N]; int place(int k) { int i; for(i=1;i<k;i++) if(abs(k-i)==abs(x[k]-x[i])||x[k]==x[i]) return 0; return 1; } int queen() { int t=1; x[1]=0; while(t>0) { x[t]++; while(x[t]<=n&&!place(t)) x[t]++; if(x[t]<=n) { if(t==n) sum++; else x[++t]=0; } else t--; } return sum; } int main() { printf("Please input n:(n<15)"); scanf("%d",&n); printf("%d\n",queen()); return 0; }