クイーン問題C言語を再帰的に解く

n-クイーンの問題を解決するための再帰的アルゴリズムを記述します。n×nのチェッカーボードにn個のクイーンを配置し、各クイーンに異なる行、異なる列、および異なる左右の対角線を持たせる必要があります。
ここに写真の説明を書いてください

アルゴリズムのアイデア:1。i
番目のクイーンはi番目の行に配置され、col [i]はi番目(1≤i≤n)のクイーンの列番号を表します。つまり、i番目のクイーンの座標位置は(i、col [i])です。
2. k番目のクイーンについて、(k、j)(1≤j≤n)が1〜k-1のクイーンと競合するかどうかをテストします。i番目の女王の場合、位置は(i、col [i])ですが、(k、j)と競合しますか?明らかにそれらは異なります。同じ列にcol [i] == jがある場合、同じ対角線に| j-col [i] | == | ki |がある場合。
3. queen(k、n)は、k-1個のクイーンが行1〜k-1に配置され、行k内の適切な列位置jをすべて見つけ、クイーンを配置してから、queen(k + 1、n)を再帰的に実行することです。 )。

#include<stdio.h>
#include<stdlib.h>
#define N 20    //最多支持20个皇后
int col[N];     //col[i]存放第i个皇后的列号
int count=0;    //统计解的个数

bool place(int k, int j)      //测试(k,j)位置能否摆放皇后
{   int i=1;
    while(i<k)
    {   if(j==col[i] || abs(j-col[i])==abs(k-i) )
            return false;     //相同列或相同对角线
        i++;
    }
    return true;
}
void queen(int k, int n)      //放置1~k的皇后
{
    if(k>n)                   //n个皇后放置完毕,输出解
    {   count++;
        printf(" 第%d个解:",count);
        for(int i=1;i<=n;i++)
            printf("(%d,%d) ", i, col[i]);
        printf("\n");
    }
    else
        for(int j=1;j<=n;j++)  //在第k行上穷举每一个列号j
            if(place(k,j))     //在第k行找到一个合适位置(k,j)
            {   col[k]=j;
                queen(k+1,n);
            }
}
int main()
{   int n;                     //n存放皇后的个数
    printf("皇后的个数n=");
    scanf("%d",&n);
    if(n>20)
        printf("n太大不能求解\n");
    else
    {
        printf("%d皇后问题求解如下:\n", n);
        queen(1,n);
    }
}

おすすめ

転載: blog.csdn.net/weixin_42467709/article/details/82113136
おすすめ