您的位置:首页 > 其它

求解八皇后问题

2007-10-27 15:40 330 查看
八皇后问题的解法
八皇后问题,是在一个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);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: