用递归解决八皇后问题,C++语言实现 以下为具体实现过程。 --------------------------分割线------------------------------------- #include<iostream> using namespace std; const int qesz=8;//问题为qesz=8的皇后问题,修改qesz的大小可以解决N皇后问题。 const int dirx[8]={1,1,0,-1, -1,-1,0,1};//8个方向 const int diry[8]={0,1,1,1, 0,-1,-1,-1}; static int count=0; //开始声明所有函数 bool IfoutBound(int x,int y)//判断x,y 是否还在数组内部 {if(x>=0&&x<qesz &&y>=0&&y<qesz) return false; else return true;} bool IfonePos(int A[qesz][qesz],int locx,int locy);//判断位置(locx,locy)能不能放置一上皇后 bool CanEndQueen(int A[qesz][qesz],int endx,int endy);//判断是不是可以结束queen函数体了,即找出所有的安放情况后要停止的前的最后判断一步 bool IfoneQueen(int A[qesz][qesz]);//判断当前情况下,是不是已经找到了一个皇后的安置情况了 bool Queen(int A[qesz][qesz],int nowx,int nowy);//解决皇后问题的主函数体 void Cout(int A[qesz][qesz]); void CoutAvailiablePos(int A[qesz][qesz]); //结束所有要声明的函数 //开始定义函数体 void Cout(int A[qesz][qesz]) { for(int i=0;i!=qesz;++i) { for(int j=0;j!=qesz;++j) printf("%4d",A[i][j]); cout<<endl; } } void CoutAvailiablePos(int A[qesz][qesz]) { int B[qesz][qesz]={0}; for(int i=0;i!=qesz;++i) { for(int j=0;j!=qesz;++j) {if(IfonePos(A,i,j)==true) B[i][j]=1; printf("%4d",B[i][j]); } cout<<endl; } } bool IfonePos(int A[qesz][qesz],int locx,int locy) //IfonePos()函数的函数体,它实现判断(locx,locy)是否可行 { for(int i=0;i!=8;++i) { for(int j=0;j!=qesz;++j) { int x=locx,y=locy; x+=j*dirx[i];y+=j*diry[i]; if(IfoutBound(x,y)==false) {if(A[x][y]!=0) return false;} else break; } } return true; } //bool CanEndQueen(int A[qesz][qesz],int endx,int endy); //bool CandEndQueen(int A[qesz][qesz], int endx, int endy) //{ // //} //bool IfoneQueen(int A[qesz][qesz]); bool IfoneQueen(int A[qesz][qesz]) { int sum=0; for(int i=0;i!=qesz;++i) for(int j=0;j!=qesz;++j) sum+=A[i][j]; if(sum==qesz) return true; else return false; } //bool Queen(int A[qesz][qesz],int nowx,int nowy); bool Queen(int A[qesz][qesz],int nowx,int nowy) { if(IfoutBound( nowx, nowy)==true) return false; if(IfonePos(A,nowx,nowy)==true) { A[nowx][nowy]=1; if(IfoneQueen(A)==true) {Cout(A);cout<<endl;++count;} if(Queen(A,nowx+1,0)==false) {A[nowx][nowy]=0; Queen(A,nowx,nowy+1); } } else { Queen(A,nowx,nowy+1); } } int main() { int A[qesz][qesz]={0}; cout<<endl; Queen(A,0,0); cout<<count<<endl; } -------------------------------分割线---------------------------- 经过运行知: 当qesz=4, 有2种方案。 当qesz=5, 有10种方案。 当qesz=6, 有4种方案。 当qesz=7, 有40种方案。 当qesz=8, 有92种方案。 当qesz=9, 有352种方案。 当qesz=10, 有724种方案。 当qesz=11 有2680种方案。 当qesz=12, 有14200种方案。
用递归解决八皇后问题,C++语言实现
原文作者:八皇后问题
原文地址: https://blog.csdn.net/happyp9/article/details/51172290
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/happyp9/article/details/51172290
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。