Codeup100000609問題D:取得再帰] [N問題をクイーン(元の問題を8-クイーン)バックトラックの最適化

1

質問D:[エントリー再帰] N問題をクイーン(オリジナル8クイーン問題)
タイムリミット:1秒メモリ制限128 MBが
提出:926解像度:436
[提出] [状態] [掲示板] [命題男性:外部インポート]
タイトルの説明
プレイチェスの人々は非常に明確である:女王は、水平、垂直、対角のステップ数に別の部分を食べることができません。チェス盤(8×8の正方形)の8人の女王は、そう、彼らは誰も食べることができないことをどのように!これは有名な8つのクイーン問題です。

入力
整数N(1 <= N <= 10)

出力
方式に対応した各出力ラインの全ての出力辞書式順序付けスキーム。女王が順次プログラムを出力し、各列は、隣接する二つの数は、スペースで区切られ、配置されています。プログラム群が実行可能でない場合は「!いいえ溶質」は、出力が
図1 5クイーンズ
1図
上に示し、対応する2,4,1,3,5に配置され、Bが対応して配置される3,5,1,4,2

样例输入
4
样例输出
2 4 1 3
3 1 4 2

2解析されました

  • タイトル:1所定範囲内の完全な秩序 - Nに、他の要素のそれぞれに配置された各要素のために取得される、プログラムの水平、垂直、対角配置で配置されていません
  • アイデア:列挙1〜Nの完全な配列、それぞれが完全なセットを含む、プログラムは現在のグループ構成の合法性を検査する(他の要素と各要素の配置は、水平、垂直、対角に配置されていません)上
  • 二つのアイデア:一の実施形態の前提に、バックトラッキングを最適化するために、各セットでは、各要素が含まれる要素の各々全体構成を含む各要素の配置の前および要素(コンフリクトか否かを判断します)、水平、垂直、対角で他の要素と配置、それはセットに要素もし競合しない、競合場合、そのまま次の基が挙げられます

3参照コード

  • Aは考えました:
#include <cstdio>
#include <cstdlib>

const int MAXN = 100;
int N;
bool hashTable[MAXN]  = {false};
int P[MAXN];
int count = 0;

void DFS(int index){//朴素算法
    if(index == N + 1){
        bool flag = true;//flag为true,表示当前方案合法
        for (int i = 1; i <= N ; ++i)//遍历两个皇后,
        {
            for (int j = i + 1; j <= N; ++j)
            {
                //第四象限内,P[y]为纵坐标,i、j为横坐标
                if(abs(i - j) == abs(P[j] - P[i])){//如果在一条对角线上,也就是正方形相对的两个端点
                    flag = false;
                }
            }
        }

        if(flag == true) {
            count++;
            for (int i = 1; i <= N; ++i)
            {
                printf("%d", P[i]);
                if(i <= N - 1) printf(" ");
            }
            printf("\n");
        }
    }

    for (int i = 1; i <= N; ++i)//全排列
    {
        if(hashTable[i] == false){
            P[index] = i;
            hashTable[i] = true;
            DFS(index + 1);
            hashTable[i] = false;
        }
    }
}

int main(){
    scanf("%d", &N);
    DFS(1);
    if(count == 0) printf("no solute!\n");
    return 0;
}
  • 思考2​​:
#include <cstdio>
#include <cstdlib>

const int MAXN = 100;
int N;
bool hashTable[MAXN]  = {false};
int P[MAXN];
int count = 0;

void DFS(int index){//朴素算法
    if(index == N + 1){
        count++;
            for (int i = 1; i <= N; ++i)
            {
                printf("%d", P[i]);
                if(i <= N - 1) printf(" ");
            }
            printf("\n");
            return;
        }


    for (int i = 1; i <= N; ++i)//第i行
    {
        if(hashTable[i] ==  false){
            bool flag = true;
            for (int pre = 1; pre < index; ++pre)
            {
                //第index列的皇后行号为i,第pre列的行号为P[pre]
                if(abs(index - pre) == abs(P[pre] - i)){
                    flag = false;
                    break;
                }
            }

            if(flag == true){
                P[index] = i;
                hashTable[i] = true;
                DFS(index + 1);
                hashTable[i] = false;
            }
        }
        
    }
}

int main(){
    scanf("%d", &N);
    DFS(1);
    if(count == 0) printf("no solute!\n");
    return 0;
}
公開された321元の記事 ウォン称賛51 ビュー40000 +

おすすめ

転載: blog.csdn.net/qq_33375598/article/details/104059358