八皇后问题(回溯法)
问题描述:
这是一个比较经典的问题,棋盘上有8x8共64个格子,要求将八个皇后放置到棋盘上,同时满足任意两个皇后不同行,不同列,并且不位于同一斜线上(45度和135度的斜线),这个问题采用的是回溯法解决的,下述代码是经过学习研究别人的代码得到。
代码如下:
#include <iostream>
#include <stdlib.h>
#include <math.h>
using namespace std;
int position[9];
char map[9][9];
int sum=0;
bool Place(int x,int row)
{
for(int i=1;i<row;i++)
{
int y=position[i];
if(abs(x-y)==abs(row-i)) //如果位于同一条斜线上
return false;
else if(position[i]==x) //如果位于同一列上
return false;
}
return true;
}
void Seek(int t)
{
if(t>8) //如果t大于8则说明8个皇后位置都已找到
{
sum++; //方案数目计数变量自加
cout<<"No:"<<sum<<endl;
for(int i=1;i<=8;i++) //打印皇后的位置
cout<<position[i]<<" ";
cout<<endl;
for(int i=1;i<=8;i++)
{
for(int j=1;j<=8;j++)
map[i][j]='.';
}
for(int i=1;i<=8;i++)
{
int j=position[i];
map[i][j]='A';
}
for(int i=1;i<=8;i++)
{
for(int j=1;j<=8;j++)
cout<<map[i][j]<<" ";
cout<<endl;
}
}
else
{
for(int i=1;i<=8;i++)
if(Place(i,t))
{
position[t]=i;
Seek(t+1);
}
}
}
int main()
{
for(int i=1;i<=8;i++) //初始化存放每行皇后位置的数组
position[i]=0;
Seek(1); //调用寻找皇后位置的函数
cout<<"Sum:"<<sum<<endl;
return 0;
}
态度决定高度,细节决定成败,

浙公网安备 33010602011771号