C語言回溯法遞歸求解八皇后問題

Problem E

8皇后問題

時限:1000ms 內存限制:10000K 總時限:3000ms

描述:

輸出8皇后問題所有結果。

輸入:

沒有輸入。

輸出:

每個結果第一行是No n:的形式,n表示輸出的是第幾個結果;下面8行,每行8個字符,‘A’表示皇后,‘.’表示空格。不同的結果中,先輸出第一個皇后位置靠前的結果;第一個皇后位置相同,先輸出第二個皇后位置靠前的結果;依次類推。

輸入樣例:

輸出樣例:

輸出的前幾行: No 1: A....... ....A... .......A .....A.. ..A..... ......A. .A...... ...A.... No 2: A....... .....A.. .......A ..A..... ......A. ...A.... .A......

....A...

#include<stdio.h> #include<math.h> int n=8,a[8],counter=1; void search(int m); int  canplace(int row,int col); void output(); int main() { search(0); return 0; } void search(int m)//回溯法遞歸求解每一行的情況 { if(m==n)output(); else  { for(int i=0;i<n;i++) { if(canplace(m,i))//判斷在該處是否能放置皇后 { a[m]=i;//用m表示行數,i表示列數,可以避免二維數組判斷時帶來的麻煩 search(m+1);//求解下一行的情況    } } } } int canplace(int row ,int col) { int i,j,flag; flag=1; for(i=0;i<row;i++) { if(a[i]==col||fabs(row-i)==fabs(col-a[i]))//判斷該列是否有皇后及於此位置在同一斜線上的位置處是否有皇后 { flag=0;//若存在,則此處不能放置皇后 break;    } } return flag; } void output() { printf("No %d:\n",counter); counter++;//輸出每個滿足條件的結果序數 for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(j==a[i])printf("A"); else printf("."); } printf("\n");  } }

發佈了52 篇原創文章 · 獲贊 23 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章