N皇后问题(回溯法)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
for(int n=0;n<q;n++)
{
cout<<a[m*q+n]<<" ";
}
cout<<endl;
}
cout<<"----------------------------------------"<<endl;
a[j] = 0;
trial(0);
cout<<"布局完毕"<<endl;
return 0;
}
void trial(int i) //递归安置元素
{
if(i>=q)
print();
else
for(int j=0;j<q;j++)
{
a[i*q+j] = 1;
if(valid(i,j))
trial(i+1);
代码片段(1)
[代码][C/C++]代码
#include "math.h"
#include "iostream"
using namespace std;
bool valid(int i,int j);//判断安置元素的合法性
void trial(int i); //递归安置元素
void print(); //显示布局
else
a[i*q+j] = 0;
}
}
bool valid(int i,int j) //判断安置元素的合法性
{
bool b=true;
for(int i1=0;i1<i;i1++)
for(int j1=0;j1<q;j1++)
if(a[i1*q+j1]==1)
{
if(j1==j)//判断是否在同一列
int q; //皇后数
int *a; //存储布局元素
int count = 0; //合法布局的序号
int main(int argc, char* argv[])
{
cout<<"请输入皇后数:"<<endl;
cin>>q;
a = new int[q*q];
for(int j=0;j<q*q;j++)
b பைடு நூலகம் false;
else if(abs(i-i1)==abs(j-j1))//判断是否在对角线
b = false;
}
return b;
}
void print() //显示布局
{
count++;
cout<<"第"<<count<<"种布局:"<<endl;
for(int m=0;m<q;m++)
{
相关文档
最新文档