回溯法解决N皇后问题 C语言

问题描述:

       八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。

回溯法:

       回溯法又称试探法。回溯法的基本做法是深度优先搜索。即从一条路往前走,能进则进,不能进则退回来,换一条路再试。

源代码:

#include<stdio.h>
#include<math.h>
int x[9]={0};
bool PLACE(int k)//检测第k个皇后能否放进棋盘
{
    int i=1;
    while(i<k)
    {
        if(x[i]==x[k]||fabs(x[i]-x[k])==fabs(i-k))
            return false;
        i++;
    }
    return true;
}
void NQUEENS(int n)
{
    int i,k=1; //k为当前行号
    x[1]=0;//x[k]为第k行皇后所放的列号
    while(k>0)
    {
        x[k]++;
        while(x[k]<=n&&!PLACE(k))//该行不符合,则放入下一行
          x[k]++;
        if(x[k]<=n)
        {
            if(k==n)//输出x[]
            {
                for(i=1;i<=n;i++)
                    printf("x[%d]:%d  ",i,x[i]);
                printf("
");
            }

            else//判断下一行
            {
                k++; x[k]=0;
            }
        }
        else k--;//没找到,则回溯
    }
    return ;
}
int main()
{
    NQUEENS(8);
    return 0;
}
原文地址:https://www.cnblogs.com/yuyu-blog/p/9046670.html