N皇后问题的非递归算法

#include <cstdio>

#include <iostream>

#define N 4

using namespace std;

int main()

{

int x[N+1],fg,k,i,s,n,j;

n=N;i=1;x[i]=1;s=0;

while(1)

{

fg=1;

for(k =i-1;k>=1;k–)

{

if(x[i]==x[k]||abs(x[i]-x[k])==i-k)
//查找是否符合条件(不在对角线上,且不再同一列)

fg =0;

}

if(fg == 1&&i==n)
//找到符合条件的组合输出

{

s++;

for(j = 1;j<=n;j++)

{

printf(“%2d”,x[j]);

}

printf(“\n”);

}

if(i<n&&fg == 1)
//如果没有冲突就像转向下一行并试探

{

//printf(“i>>>>%d\n”,i);

i++;

x[i]=1;
//对下一行进行初始化赋值

continue;

}

while(x[i] == n&&i>1)
//回溯(当某一行i走到行尾时就回溯)

i–;

if(i==1&&x[i]==n)
//判断是否结束,及第一行走到行尾

break;

else

x[i]=x[i] +1;
//如果没有结束就试探本行的下一个位置

}

printf(“%d\n”,s);

}

    原文作者:递归算法
    原文地址: https://blog.csdn.net/weinierzui/article/details/41673919
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞