您的位置:首页 > 编程语言 > C语言/C++

n后问题的c++实现

2010-05-26 10:54 232 查看
问题描述:在n*n格的期盼上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处于同一行或同一列或同一斜线上的棋子。n 后问题等价于在n*n的棋盘上放置n个皇后,使得任意2个皇后不在同一行或同一列或同一斜线上。
c++代码如下:

#include<iostream>

using namespace std;

class nQueen

{

public:

 friend int nqueen(int);//友元函数

private:

 bool place(int k);//检查当前的结点是否可被放置

 void backtrack(int t);递归的调用以确定各个行的位置

 int n,*x;

 long sum;//记录当前可行解的个数

};

bool nQueen :: place(int k)

{

 for(int j=0;j<k;j++)

  if(abs(k-j)==abs(x[j]-x[k]) || x[j]==x[k])

   return false;

 return true;

}

void nQueen::backtrack(int t)

{

 if(t>n)

  sum++;

 else

  for(int i=1;i<=n;i++)

  {

   x[t]=i;

   if(place(t))

    backtrack(t+1);

  }

}

int nqueen(int n)

{

 nQueen f;

 f.n=n;

 f.sum=0;

 int *p=new int[n+1];

 for(int i=0;i<=n;i++)

  p[i]=0;

 f.x=p;

 f.backtrack(1);

 delete []p;

 return f.sum;

}

int main()

{

 int m;

 cout<<"请输入棋盘的行数:/n";

 cin>>m;

 cout<<nqueen(m)<<endl;

 return 0;

}

以上是经过调试的正确的c++代码,上面的代码只能将究竟有多少种情况算出来。如果谁能够将各种情况一表格的形式显示出来,就更好了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ delete c