8.1問題D:[再帰の概要] nクイーンズ問題(元の8クイーンズ問題)

タイトル説明

       チェスをすることができる人は非常によく知っています:女王は制限なしで水平、垂直、および斜めの線で他の駒を取ることができます。ボードに8つのクイーン(8 * 8の正方形があります)を置いて、どれも食べられないようにする方法!これは有名なエイトクイーンの問題です。

 

入る

整数n(1 <= n <= 10) 

出力

出力の各行はスキームに対応し、すべてのスキームは辞書式順序で出力されます。各スキームは、2つの隣接する番号の間のスペースで区切られた、クイーンの列番号を順番に出力します。実行可能な解決策のセットがない場合は、「溶質なし!」と出力します。

サンプル入力コピー

4

サンプル出力コピー

2 4 1 3 
3 1 4 2
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int n,a[20],ans,cnt,b[800][20];
void dfs(int deep)
{
    if(deep==n+1){
        ans++;
        for(int i=1;i<=n;i++) b[cnt][i]=a[i];
        cnt++;
        return;
    }
    for(int i=1;i<=n;i++){
        bool flag=true;///判断当前位置是否合法
        for(int j=1;j<deep;j++){
            if(a[j]==i||(deep-j)==abs(i-a[j])){
                flag=false;
                break;
            }
        }
        if(flag){//如果当先位置合法,则递归搜索下一个合法位置
            a[deep]=i;
            dfs(deep+1);
        }
    }
    return;
}
int main()
{
    while(scanf("%d",&n)!=EOF){
        cnt=0;
        ans=0;
        dfs(1);
        if(ans==0) printf("no solute!\n");
        else{
            for(int i=0;i<cnt;i++){
                for(int j=1;j<=n;j++){
                    printf("%d ",b[i][j]);
                }
                printf("\n");
            }
        }
    }
    return 0;
}

 

おすすめ

転載: blog.csdn.net/wangws_sb/article/details/114931273