用递归解决八皇后问题,C++语言实现

 用递归解决八皇后问题,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种方案。
    原文作者:八皇后问题
    原文地址: https://blog.csdn.net/happyp9/article/details/51172290
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞