[2017ブルーブリッジカップ予備]分割のグリッド

 

 

タイトル説明

6x6の正方形、グリッドのエッジに沿った2つの部分に切断。これは、2つの部分の同じ形状を必要とします。図セグメンテーション方法が可能です。 

計算は:法律、異なるセグメントの合計数を含むこの3点が挙げられます。注:同一の分割方法に属し回転対称。 

輸出

出力は、整数の答えを表し、

 

 

ソリューション:

  観察知ることができ、境界線上の点は、点(3,3)であることは対称であるので、パターンの4つの方向に、その点から検索を開始

  縦方向が対称であるので、検索は計算を繰り返した場合。同様に、左右方向は、最終的な結果は、4で割られます

回答:509

 

 

 

書式#include <iostreamの> 
の#include <キュー> 
の#include <アルゴリズム> 
書式#include < セット > 
の#include < 文字列の.h>
 使用して 名前空間はstdを、

INTの DIR [ 4 ] [ 2 ] = {{ 01 }、{ 0、 - 1 }、{ 10 }、{ - 10 }}。
INTネジ[ 10 ] [ 10 ]。
INT年= 0 ;
ボイド DFS(int型のx、int型のY)
{
    IF(X == 0 || Y == 0 || == X 6 || Y == 6// 検索境界位置
    {
        ANS ++ ;
        リターン;
    }
    以下のためにINT iが= 0 ; I < 4 ; I ++ 
    {
        あなた X1 = X + DIR [I] [ 0 ];
        あなたは、Y1 = Y + dirを[I] [ 1 ];
        
        int型 X2 = 6。 - X1; // 対称方向
        int型 Y2 = 6。 - Y1;
        
        もし(X1> = 0 && Y1> = 0 && X1 <= 6 && Y1 <= 6 
        {
            IF(!VIS [X1] [Y1])// 点対称であり、決意をすることができます
            {
                ビュー[X1] [Y 1] =表示[X2]、[Y 2] = 1 ;
                DFS(X1、Y1);
                VIS [X1] [Y1] = VIS [X2] [Y2] = 0 ; // バック
            }
        }
    }
}
 
 
INT メイン(){
    memsetの(VIS、0はsizeof (VIS))。
    VIS [ 3 ] [ 3 ] = 1 
    DFS(33 )。
    printf(%D \ N- 、ANS / 4); // 垂直方向が対称である計算横方向は同様に、最終的な結果は4で割ったとき、検索が繰り返されます
    
    リターン 0 ;
}

 

おすすめ

転載: www.cnblogs.com/-citywall123/p/12325896.html