問題描述:
八皇后問題是一個以國際象棋為背景的問題:如何能夠在 8×8 的國際象棋棋盤上放置八個皇后,使得任何一個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行、縱行或斜線上。
回溯法:
回溯法又稱試探法。回溯法的基本做法是深度優先搜索。即從一條路往前走,能進則進,不能進則退回來,換一條路再試。
源代碼:
#include<stdio.h> #include<math.h> int x[9]={0}; bool PLACE(int k)//檢測第k個皇后能否放進棋盤 { int i=1; while(i<k) { if(x[i]==x[k]||fabs(x[i]-x[k])==fabs(i-k)) return false; i++; } return true; } void NQUEENS(int n) { int i,k=1; //k為當前行號 x[1]=0;//x[k]為第k行皇后所放的列號 while(k>0) { x[k]++; while(x[k]<=n&&!PLACE(k))//該行不符合,則放入下一行 x[k]++; if(x[k]<=n) { if(k==n)//輸出x[] { for(i=1;i<=n;i++) printf("x[%d]:%d ",i,x[i]); printf("\n"); } else//判斷下一行 { k++; x[k]=0; } } else k--;//沒找到,則回溯 } return ; } int main() { NQUEENS(8); return 0; }