C++实现n皇后问题

 //参照书籍:计算机算法基础-华中科技大学第三版

//用回溯法实现n皇后问题,其中nqueens(int k)方法用递归实现,为了提高效率可以改成非递归

//queen.h--Queen class
#ifndef _QUEEN_H_
#define _QUEEN_H_
#include<iostream>
class Queen
{
private:
 int queens;//total queens
 int *answer;//answer array 
 int sum;//total answers
 //judge a certain place is available,k represent row,i represent column
 bool place(int k,int i)const;
 void printResult()const;//print result
public:
 Queen(int n);
 ~Queen();
 void nqueens(int k=1);//search the solutionof vector space under the condition 
 void printSum()const{ std::cout<<sum<<std::endl;}
};
#endif
//N_QUEEN.cpp--Queen class methods
#include<cmath>
#include"queen.h"
Queen::Queen(int n)
{
 queens=n;
 answer=new int[n+1];
 sum=0;
}
Queen::~Queen()
{
 delete []answer; 
}

void Queen::nqueens(int k)
{
 answer[k]=1;
 while(answer[k]<=queens)
 {
  if(place(k,answer[k]))
  {
   if(k==queens)
   {
    sum++;
    printResult();
   }
   else
    nqueens(k+1);
  }
   answer[k]=answer[k]+1;
 }
}
bool Queen::place(int k,int i)const
{
 int m=1;
 while(m<k)
 {
  if(answer[m]==answer[k]||abs(answer[k]-answer[m])==abs(k-m))
   return false;
  m++;
 }
 return true;
}
void Queen::printResult()const
{
 for(int i=1;i<queens;i++)
 {
     std::cout<<answer[i]<<"  ";
 }
 std::cout<<std::endl;
}
//use.cpp--test Queen class
#include<iostream>
#include"queen.h"
int main()
{
 std::cout<<"Enter the queens:";
 int m;
 std::cin>>m;
 Queen q=Queen(m);
 q.nqueens();
 std::cout<<"Total methods: ";
 q.printSum();
 std::cout<<"Done!\n";
 return 0;
}

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值