C ++のnクイーン問題

タイトル説明

人々は非常に明確なチェスをする:女王は、水平、垂直、対角のステップ数に別の部分を食べることができません。どのようにチェス盤の8つのクイーン(8×8の正方形)、彼らは誰でも食べることができないように!これは有名な8つのクイーン問題です。

エントリー

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

輸出

各出力線は、一つのアプローチ、女王は、隣接する二つの数は、辞書順の出力に応じて、スペースで区切られた各列内の各番組を順次出力の列番号に対応します。対応するプログラムは、-1の出力は存在しない場合。

サンプル入力

4

サンプル出力

2 4 1 3
3 1 4 2

ソースコード

#include <bits/stdc++.h>
using namespace std;
bool used[11];
int g[11][11];
int n;
bool flag=0;
bool check(int x,int y)
{
    int xx = x,yy = y;
    while(x >= 1&&y >= 1)
    {
        if(g[x][y] == 1) return 0;
        x--,y--;
    }
    x = xx,y = yy;
    while(x >= 1&&y <= n)
    {
        if(g[x][y] == 1) return 0;
        x--,y++;
    }
    return 1;
}
void dfs(int u)
{
    if(u == n + 1)
    {
        for(int i = 1;i <= n;i ++)
        {
            for(int j = 1;j <= n;j ++)
            if(g[i][j] == 1)
            {
                printf("%d ",j);
                break;
            }
        }
        printf("\n");
        flag = 1;
    }
    for (int i = 1;i <= n;i ++)
    if(used[i] == 0&&check(u,i) == 1)
    {
        g[u][i] = 1;
        used[i] = 1;
        dfs(u + 1);
        used[i] = 0;
        g[u][i] = 0;
    }
}
int main()
{
    cin >> n;
    memset(used,0,sizeof(used));
    memset(g,0,sizeof(g));
    dfs(1);
    if(flag == 0) cout << -1 << endl;
    return 0;
}

おすすめ

転載: www.cnblogs.com/LJA001162/p/11334919.html