问题描述:
八皇后问题是一个以国际象棋为背景的问题:如何能够在 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(" "); } else//判断下一行 { k++; x[k]=0; } } else k--;//没找到,则回溯 } return ; } int main() { NQUEENS(8); return 0; }