八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。当且仅当 n = 1 或 n ≥ 4 时问题有解。
方法一:递归实现
方法二:迭代实现
方法三:利用全排列递归实现
实现代码如下:
#include<iostream> #include<cmath> using namespace std; bool place(int *Q,int len,int index); bool check(int *Q,int len); void Queue1(int *Q,int len,int index); void Queue2(int *Q,int len); void Queue3(int *Q,int len,int index); int main() { int len; cin>>len;//输入皇后的个数 int *Q=new int[len+1];//Q[0]暂不使用 cout<<"method1:"<<endl; Queue1(Q,len,1); cout<<"method2:"<<endl; Queue2(Q,len); cout<<"method3:"<<endl; for(int i=1;i<=len;i++) Q[i]=i; Queue3(Q,len,1); delete []Q; return 0; } /////////////////////////////////////////////////////////////////////////////////// bool place(int *Q,int len,int index) { int i; for(i=1;i<index;i++) { if(Q[index]==Q[i]||abs(index-i)==abs(Q[index]-Q[i])) return false; } return true; } //递归实现 void Queue1(int *Q,int len,int index) { if(Q==NULL||len<=0) return; if(index>len) { static int num1=1; cout<<num1++<<":"; for(int i=1;i<=len;i++) cout<<Q[i]<<" "; cout<<endl; } else { for(int i=1;i<=len;i++) { Q[index]=i; if(place(Q,len,index)) Queue1(Q,len,index+1); } } } ///////////////////////////////////////////////////////////////////////////////// //非递归实现 void Queue2(int *Q,int len) { int i,k; for(i=1;i<=len;i++) Q[i]=0; k=1; while(k>=1) { Q[k]=Q[k]+1; //在下一列放置第k个皇后 while(Q[k]<=len&&!place(Q,len,k)) Q[k]=Q[k]+1;//搜索下一列 if(Q[k]<=len&&k==len)//得到一个输出 { static int num2=1; cout<<num2++<<":"; for(i=1;i<=len;i++) cout<<Q[i]<<" "; cout<<endl; } else if(Q[k]<=len&&k<len) k=k+1;//放置下一个皇后 else { Q[k]=0;//重置Q[k],回溯 k=k-1; } } } ///////////////////////////////////////////////////////////////////////////////////// //检查全排列是否符合摆放要求 bool check(int *Q,int len) { for(int i=1;i<=len;i++) { for(int j=i+1;j<=len;j++) { if(abs(j-i)==abs(Q[j]-Q[i])) return false; } } return true; } //利用全排列实现 void Queue3(int *Q,int len,int index) { if(Q==NULL||len<=0) return; if(index>len) { if(check(Q,len))//对生成每个全排列进行检查,若符合要求则输出 { static int num3=1; cout<<num3++<<":"; for(int i=1;i<=len;i++) cout<<Q[i]<<" "; cout<<endl; } } else { for(int i=index;i<=len;i++) { int temp=Q[i]; Q[i]=Q[index]; Q[index]=temp; Queue3(Q,len,index+1); temp=Q[index]; Q[index]=Q[i]; Q[i]=temp; } } }