羅区P1219 8人の女王の問題解決

タイトル説明

X 6 6以下のチェッカーボードをチェックし、各行ように6個の基板上に配置された、カラム、及び唯一、各対角線(すべて主対角2本の平行線を含みます)高々一枚上。

上記配列がレイアウト246に記載さ135とすることができ、それは次のようにi番目の桁は、i行目の対応する位置にピースを有する意味します:

行番号123 456

列番号246135

それはちょうどチェッカーソリューションを置いです。すべてのチェッカーを配置する解決策を見つけるためにプログラムをコンパイルしてください。シーケンスおよび上記の方法に出力します。ソリューションは、辞書順で配置されています。前の3つのソリューションの出力をしてください。最後の行は、ソリューションの合計数です。

// usaco公式から次の単語は、ビュー羅バレーを表すものではありません

特記事項:大きなN(基板サイズN×N個)の場合は、あなたのプログラムをより効果的に改善されるべきです。すべてのソリューションは、事前に計算され、その後、出力のみ(またはそれについての式を見つける)、これは浮気されないでください。あなたは不正行為を主張した場合は、USACOトレーニングのログインアカウントが削除され、任意のレースのUSACOに参加することはできません。私はあなたに警告しました!

入力形式

数N(6 <= N <= 13)は、N×N個であり、基板サイズを表します。

出力フォーマット

二つの数字各溶液との間の空間によって分離された最初の三つの作用、前の3つの溶液。4行目は唯一の数、ソリューションの総数です。

サンプル入力と出力

入力#1
6
出力#1
2 4 6 1 3 5 
3 6 2 5 1 4 
4 1 5 2 6 3 
4

説明/ヒント

NOCOWからタイトル翻訳。

USACOトレーニングセクション1.5


 

問題の解決策

この質問は、標準のDFSのタイトルです。非常にシンプルなアイデアは、2次元配列VISによって影響を受ける部分を配置した後、グリッドを表現することですがあります。各ピースは全て格子DFS -1の終了後、+ 1の影響グリッド侯に配置されます。

書式#include <iostreamの> 
書式#include <stdio.hに> 
する#include <math.h>の
書式#include <アルゴリズム> 
書式#include < 文字列の.h> 使用して名前空間はstdを、const int型     MAXN = 1005 ;
INTの         N、S = 0、CNT = 0、CNT2 = 0 int型        VIS [MAXN] [MAXN]、[MAXN] [MAXN]、[MAXN] [MAXN]マップANS; ボイド DFS(INT X)
{ 場合(X> N)
    { 
        S ++ 
        CNT

 

 


    ++ ;
        もし(CNT <= 3 
        { 
            CNT2 = 0 以下のためにint型 i = 1 ; iが= <N; iは++ 
            { 
                ためのint型 J = 1 ; J <= nであり、j ++ 
                { 
                    場合(地図[I] [J] == 1 
                    { 
                        CNT2 ++ 
                        ANS [CNT] [CNT2] = J。
                    } 
                }
            } 
        } 
        を返します
    } 
    のためにint型 I = 1を iが++; iが<= N 
    { 
        場合(== VIS [X] [I] 0 
        { 
        //     COUT << X << "" << I << ENDL。
            VIS [X] [i]の++ ; 
            [i]は地図[X] = 1 INTの J = 1 ; J <= nであり、j ++ 
            { 
                VIS [X] [J] ++ ;
                もし(J> = X)
                {
                    VIS [J] [i]は ++
                } 
                もし、(X + J <= N && I> = J)
                { 
                    VIS [X + J] - ++ [I、J] 
                } 
                もし、(X + 1、J <= N && I + J <= N)
                { 
                    VIS [X + j] [iがjは+] ++ ; 
                } 
            } 
            DFS(X + 1 )。
            VIS [X] [i]を - 
            マップ[X] [I] = 0 ;
            以下のためのint型 J = 1 ; J <= N; J ++ 
            { 
                VIS [X] [J] - もし(J> = X)
                { 
                    VIS [J] [I] - 
                } 
                もし、(X + J <= N && I> = J)
                { 
                    VIS [X + j]は[I - J] - 
                } 
                もし、(X + jが<= N && iはJ <= + N)
                { 
                    VIS [X + j]を[I jの+] - 
                } 
            } 
        } 
    } 
} 


int型のmain()
{
    cinを >> N; 
    DFS(1 )。
    以下のためにint型 i = 1 ; iが<= 3 ; I ++ 
    { 
        ためのint型 J = 1 ; J <= nであり、j ++ 
        { 
            COUT << ANS [I] [J] << "  " 
        } 
        COUT << ENDL。
    } 
    COUT << CNT << ENDL。

    リターン0 )。
}

もともと私はこのコードTLEと思ったが、それはそのACコード幸いです。800 + MSとの最後のテストポイント。

このコードは、代わりに二次元配列の三次元アレイであってもよいし、最適化することができます。すべての列を表す1次元配列は、限り列の布片が存在するように、この配列要素に対応する列が1に設定されています。二行と平行2本の対角線の同様の1次元配列を表します。

おすすめ

転載: www.cnblogs.com/zealsoft/p/11415432.html