[ブルーブリッジカップ2016予選]ボックス番号の塗りつぶし

トピックリンク:http://oj.ecustacm.cn/problem.php?id=1284

 

タイトル説明

グリッド10以下、番号0-9を入力してください。要件:隣接しない2つの連続した番号。
(左右、上下、斜めに隣接すると考えられる)の合計の数を満たすために可能な解決策の数?

輸出

塗りつぶしは、プログラムの整数を表してください。
 
 

アイデア:

DFSの各正方形を横断する方法を採用し、我々はすべてのその行に入れたものをその左右、上下、質問の意味か対角線、決定するためにそれぞれの正方形に会いました。

そして、私たちは2つのギャップを取るためだけの罰金を横断する一つの入り口出口方法があります

 

書式#include <iostreamの> 
の#include <アルゴリズム> 
書式#include < 文字列 > 
の#include < 文字列の.h> 
の#include <ベクトル> 
の#include <マップ> 
書式#include <スタック> 
の#include < 設定 > 
書式#include <キュー> 
書式#include < math.h>の
書式#include <cstdioを> 
する#include <iomanip> 
の#include <TIME.H> の#define LL長い長
 の#define INF 0x3f3f3f3f
 の#define LS NOD << 1個
 の#define RS(NOD <<1)+1 のconst int型



 + = MAXN 1E5 10 constの LL MOD = 20010905 ; 

CONST  INT R = 3、C = 4 int型のマップ[ 10 ] [ 10 ]を2回[ 20 ] CNT。

INTを言う[ 8 ] [ 2 ] = { 0 - 1 - 1 - 1 - 10、 - 110111101、 - 1 }。

ブールチェック(int型のx、int型の Y、INT N){
     ためINT iは= 0 ; iが< 8 ; I ++ ){
         int型 NX = X + DIR [I] [ 0 ]。
        INT NY = Y + DIR [I] [ 1 ]。
        もし(NX> = 0 && NX <R && NY> = 0 && NY < C){
             場合(地図[NX] [NY] == N- 1 ||地図[NX] [NY] == N + 1 リターン ; 
        } 
    } 
    戻り 
} 

ボイド DFS(INT DEP、INT POS){
     場合(DEP == 2 && POS == 3 ){ 
        CNT ++ リターン; 
    } 
    であれば(POS> = C)
        DFS(DEP + 10 );
    他の{
         のためには、int型は、私は= 0 ; I <= 9 ; I ++ ){
             もし!(VIS [I] &&チェック(DEP、POS、I)){ 
                VIS [I] = 1 
                マップ[DEP] [POS] = iは、
                DFS(DEP、POS + 1 )。
                マップ[DEP] [POS] = - 10 
                VIS [I] = 0 ; 
            } 
        } 
    } 
} 

INTがメイン(){
     ためには、INTは私= 0 ; I < 10 ; I ++ ){
         ためINT J = 0 ; J < 10 ; J ++
            マップ[I] [J] = - 10 
    } 
    のmemset(VIS、0はsizeof (VIS))。
    CNT = 0 ; 
    DFS(01 )。
    printf(" %dの\ n " 、CNT)。
    リターン 0 ; 
}

 

もちろん、暴力カップ法の暴力がなければなりません。

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
INT のmain()
{ 
   int型 [ 10 ] = { 0123456789 }。
   int型 ANS = 0 ;
   実行
   { 
       場合((ABS([ 0 ] -a [ 1 ])!= 1)&&(ABS([ 1 ] -a [ 2 ])!= 1)&&(ABS([ 3] -a [ 4 ])!= 1)&&(ABS([ 4 ] -a [ 5 ])!= 1)&& 
          (ABS([ 5 ] -a [ 6 ])!= 1)&&(ABS ([ 7 ] -a [ 8 ])!= 1)&&(ABS([ 8 ] -a [ 9 ])!= 1)&& 
          (ABS([ 0 ] -a [ 4 ])!= 1)&&(ABS([ 1 ] -a [ 5 ])!= 1)&&(ABS([ 2 ] -a [ 6 ])!= 1)&& 
          (ABS([3 ] -a [ 7 ])!= 1)&&(ABS([ 4 ] -a [ 8 ])!= 1)&&(ABS([ 5 ] -a [ 9 ])!= 1)&& 
          ( ABS([ 0 ] -a [ 3 ])!= 1)&&(ABS([ 0 ] -a [ 5 ])!= 1)&&(ABS([ 1 ] -a [ 4 ])!= 1)&& 
          (ABS([ 1 ] -a [ 6 ])!= 1)&&(ABS([ 2 ] -a [ 5 ])!= 1)&&(ABS([ 4] -a [ 7 ])!= 1)&&(ABS([ 4 ] -a [ 9 ])!= 1)&& 
          (ABS([ 3 ] -a [ 8 ])!= 1)&&(ABS ([ 5 ] -a [ 8 ])!= 1)&&(ABS([ 6 ] -a [ 9 ])!= 1 ))
            ANS ++ 
 
   } 一方(next_permutation(+ 10 ))。
 
   coutの << ANS << てendl; 
 
}

 

おすすめ

転載: www.cnblogs.com/-Ackerman/p/12241361.html