N皇后問題(搜尋C語言版)
阿新 • • 發佈:2018-11-11
用陣列int x[N]表示棋盤狀態,例如x[0]=1表示第0行皇后放在第1列。
皇后k在第k行第x[k]列:(k,x[k])
測試方法:測試皇后k在第k行第x[k]列時,是否與前面已放置好的皇后j相攻擊。
x[j]== x[k] 時,兩皇后在同一列上;
abs(k-j)==abs(x[j]-x[k]) 時,兩皇后在同一斜線上。
兩種情況兩皇后都可相互攻擊
#include <stdio.h> #define N 4 int x[N], sols; /* 放置皇后到位置(row,col),若成功返回1,失敗返回0 */ int place(int row) { int j; for (j=0;j<row;j++) /* j代表行 */ { if(row-x[row]==j-x[j]||row+x[row]==j+x[j]||x[j]==x[row]) return 0; } return 1; } void backtrack(int row) { int k; if ( N == row ) { sols++; // 解的結果加1 for( k=0 ; k<N ; k++ ) printf("(%d,%d) ", x[k]+1,k+1); printf("\n"); } else { int i; for( i=0 ; i<N ; i++ ) { x[row] = i; if( place(row) ) backtrack(row + 1); } } } int main( ) { backtrack(0); printf("Total Solutions: %d\n", sols); return 0; }
程式碼中是4皇后,執行結果: