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"); } }