递归---n皇后问题

来源:互联网 发布:电子黑板软件 编辑:程序博客网 时间:2024/05/17 09:04
感谢提供n皇后递归解法的那位大牛。。。
#include<iostream>using namespace std;#define N 20 int q[N];         //各皇后所在的行号int count = 0;     //统计解的个数void print(int n)//输出一个解{  int i,j;  count++;  cout<<"第"<<count<<"个解:";  for(i=1;i<=n;i++)  cout<<"("<<i<<","<<q[i]<<")";  cout<<endl;  for(i=1;i<=n;i++)        //行  {                        for(j=1;j<=n;j++)   //列         {                if(q[i]!=j)                       cout<<"0";                else                       cout<<"X";           }         cout<<endl;  }}//检验第i行的k列上是否可以摆放皇后int find(int i,int k) {  int j=1;  while(j<i)  //j=1~i-1是已经放置了皇后的行  {         //第j行的皇后是否在k列或(j,q[j])与(i,k)是否在斜线上         if(q[j]==k ||abs(j-i)==abs(q[j]-k))                return 0;         j++;  }  return 1;}//放置皇后到棋盘上void place(int k,int n) {  int j;  if(k>n)         print(n);  else  {         for(j=1;j<=n;j++)   //试探第k行的每一个列         {                if(find(k,j))                {             q[k] = j;                place(k+1,n);                  }         }  }} int main(void){  int n;  cout<<"请输入皇后个数:";  cin>>n;  cout<<endl;  cout<<n<<"皇后情况:";  place(1,n);  cout<<"共有"<<count<<"种不同的排列"<<endl;  system("pause");  return 0;}

原创粉丝点击