回溯法———n皇后问题

xiaoxiao2021-02-28  109

#include<math.h> int n,m=1; int a[1024]={0}; int check(int a[],int n) { for(int i=1;i<n;i++) { if(abs(a[i]-a[n])==abs(i-n) || a[i]==a[n])//见下面注释 return 0; } return 1; } int fun(int i){ int j,k; for(j=1;j<=n;j++) { a[i]=j; if(check(a,i)) { if(i<n) fun(i+1); else { printf("第%d个排列方法:\n",m); for(k=1;k<=n;k++) { printf("第%d个皇后的位置:%d\n",k,a[k]); } printf("\n"); m++; } } } } int main(){ printf("请输入皇后数:\n"); scanf("%d",&n); fun(1); }

输出结果:

回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。回溯算法的 基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。用回溯算法解决问题的一般步骤为: 1、定义一个解空间,它包含问题的解。 2、利用适于搜索的方法组织解空间。 3、利用深度优先法搜索解空间。 4、利用限界函数避免移动到不可能产生解的子空间。 问题的解空间通常是在搜索问题的解的过程中动态产生的,这是回溯算法的一个重要特性。

转载请注明原文地址: https://www.6miu.com/read-32480.html

最新回复(0)