关于八皇后的一种数学解决方法:
众所周知八皇后问题中
当你需要在新的每一行中添加一个皇后时 你都需要判断该点所在的行,列,和左右两个斜对角线上是否存在皇后,
可能传统的方法你会想到一个个找毕竟计算机运算能力强大! 其实错误!不要忘记了数学! 有了数学的利器,代码写的少了而且运算更加快!
设一个函数来判断一个点能否放皇后的代码如下:
row为行 col为列 这都是需要传进来的参数
bool queen::place(int row,int col){
if(row == 1) return true;//显然当为第一行时肯定不需要判断 因为没有任何皇后!
for(int j = 1;j<row;j++)//此处的 j 相当于从第一行开始寻找比如,a 为我设置的一个数组,其实很简单 假设 我在第一行的第二列放用一个皇后 那么我就令a【1】= 2;
{
if(a[j] == col) return false;//a其实就相当 于存储一个行上皇后所在的列数,此时如果你想放皇后的位置所在的列已经有皇后了当然要返回false
if(abs(j-row) == abs(a[j]-col)) return false;//这就用到数学了!相当于是横坐标与纵坐标,把棋盘想象为一个坐标系如果两个点的横坐标之差的绝对值与枞坐标之差的绝对值相等毫无疑问那这两点必定在同一条斜直线上 所以返回false
}
return true;
}
以下是八皇后的完整代码:
#include<iostream>
#include<cmath>
using namespace std;
int count = 0;
class queen{
public:
void showresult(int number);
void shownumber();
bool place(int row,int col);
int a[9];
};
void queen::shownumber(){
cout<<count<<endl;
}
bool queen::place(int row,int col){
if(row == 1) return true;
for(int j = 1;j<row;j++)
{
if(a[j] == col) return false;
if(abs(j-row) == abs(a[j]-col)) return false;
}
return true;
}
void queen::showresult(int number){
int i,j;
for(i = 1;i<=number;i++)
{
for(j = 1;j<a[i];j++)
cout<<"0";
cout<<"1";
for(j++;j<=number;j++)
cout<<"0";
cout<<endl;
}
}
void back(int t,queen&hu,int number)
{
if(t>number){
cout<<"------------------------"<<endl;
hu.showresult(number);
count++;
}
else{
for(int j = 1;j<=number;j++)
{
if(hu.place(t,j))
{
hu.a[t] = j;
back(t+1,hu,number);
}
}
}
}
int main()
{
queen hu;
int number;
cout<<"请输入您想要计算的皇后数目:";
cin>>number;
back(1,hu,number);
hu.shownumber();
return 0;
}