求解八皇后问题

八皇后问题的解法

         八皇后问题,是在一个8×8的棋盘上,放上8个皇后,要求在棋盘的行,列,对角线上只能有一个皇后。对这个问题的典型解法是利用回溯算法。即先假设在第一个格子放一个皇后,因为一行一列中只能有一个皇后,所以跳到下一行放置第二个皇后,然后检查该位置放置的皇后是否与之前所置所有皇后冲突,若无冲突,继续执行。若冲突,则选择当前行中其他位置进行放置,若当前行中所有位置都不能满足,则跳到上一行,删除上一行放置的棋子,并将此位置标记为false,然后更换位置。重复做以上方法。当旗子数等于棋盘的行数时,求解完成,打印输出。

以下是求解八皇后问题的完整代码:

头文件:

#include<iostream>

#include<string>

using namespace std;

 

const int max_board=30; //棋盘允许的最大大小

int sum=0;记录解法总数

 

class Queens

{

public:

       Queens ();

       Queens (int size);

       void print() const;

       bool unguarded(int col) const; //判断当前位置是否与其他位置冲突,若冲突,则返回false,否则,返回true

       void insert(int col);  //插入皇后

       void remove(int col);//移除上一行的皇后

       bool is_solved() const;//是否有解?

       int board_size;

private:

       int count;

       bool queen_square[max_board][max_board];

};

 

 

Queens::Queens(int size)

{

       board_size=size;

       count=0;

       for(int row=0;row<board_size;row++)

              for(int col=0;col<board_size;col++)

                     queen_square[row][col]=false;

}

 

void Queens::insert(int col)

{

       queen_square[count++][col]=true;

}

 

void Queens::remove(int col)

{

       queen_square[--count][col]=false;

}

 

bool Queens::is_solved() const

{

       return count==board_size;

}

 

void Queens::print() const

{

       sum++;

       cout<<""<<sum<<"种解法"<<endl;

       for(int row=0;row<board_size;row++)

       {

              for(int col=0;col<board_size;col++)

              {

                     if(queen_square[row][col]==true)

                            cout<<"1 ";

                     else

                            cout<<"0 ";

              }

              cout<<endl;   

       }

}

 

bool Queens::unguarded(int col)const

{

       int i;

       bool ok=true;

       for(i=0;ok && i<count;i++)

              ok=!queen_square[i][col];

       for(i=1;ok && count-i>=0 && col-i>=0;i++)

              ok=!queen_square[count-i][col-i];

       for(i=1;ok && count-i>=0 && col+i<board_size;i++)

              ok=!queen_square[count-i][col+i];

       return ok;

}

 

 

源文件:

#include"Queens.h"

#include<iostream>

 

using namespace std;

 

int main()

{

 

       int board_size;

       void solve_from( Queens &configuration);

       cout<<"What is the size of the board?"<<endl;

 

       cin>>board_size;

       if(board_size<0 || board_size>max_board)

              cout<<"The number must be between 0 and "<<max_board<<endl;

       else{

              Queens configuration(board_size);

              solve_from(configuration);

       }

       if(sum==0)

              cout<<"无解!"<<endl;

       cin.get();

       cin.get();

       return 0;

 

}

 

       void solve_from( Queens &configuration)

       {

              if(configuration.is_solved())

                     configuration.print();

              else

              for(int col=0;col<configuration.board_size;col++)

                     if(configuration.unguarded(col))

                     {

                            configuration.insert(col);

                            solve_from(configuration);

                            configuration.remove(col);

                     }

 

       }

 

 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值