馬は一日行く(DFS)

馬は、中国でB形状にチェスのルールを移動しました。

プログラムは、所与の基板サイズn×m個、及び馬の初期位置(x、y)を書いてください、要求はボード上の同じ点を通して繰り返すことができない、馬は計算することができるどのように多くのルートボード上のすべての点を通ります。

入力最初の行の整数T(T <10)は、テスト・データ・セットの数を示します。
テストデータの各セットは、4つの整数の行が含まれ、それぞれ、基板サイズと初期位置がN、M、X、Y座標。(0 <= X <= N -1,0 <= Y <= M-1、M <10、N <10)出力各行を含む試験データ、整数であり、馬の総数は、ルートボード表現を横断することができ、 0は一度横断することはできません。サンプル入力

1 
5 4 0 0

サンプル出力

32
書式#include <iostreamの> 
の#include <アルゴリズム> 
書式#include <cstdioを> 
する#include < 文字列 > 
の#include <CStringの> 
の#include <cstdlib> 
書式#include <マップ> 
書式#include <ベクトル> 
の#include < 設定 > 
書式#include <キュー> 
書式#include <スタック> 
の#include <cmath>
 使用して 名前空間はstdを、
#define TLEのstd ::イオス:: sync_with_stdio(偽); cin.tie(NULL); cout.tie(NULL);
#define PQ PRIORITY_QUEUE <整数>
pqn PRIORITY_QUEUE <ノード>
 の#define Vベクター<整数>
 の#define VLベクター<LL>
 の#define LSONのRT << 1、L、M
 の#define rsonのRT << 1 | 1、M + 1、R用
 の#define読み出す(X )のscanf( "%dの"、およびX)
 の#define LREAD(X)のscanf( "%のLLD"、&x)は、
#define PT(X)のprintf( "%d個の\ n"、(X))
 の#defineイエスのprintf( "YES \ n");
#defineなしのprintf( "NOの\ n");
#define GCD __gcd
 の#define MEM(S、T)のmemset(S、T、はsizeof(S))
 の#define CN CIN >>
 の#define CT COUT <<
 の#define OK戻り0;
#defineリターン再;
#define担当者(J、K)のための(iは= INT(INT)〜(j)は、iが=(INT)(k)を<; Iは++)
 の#defineの入力(k)を(I = 1をint型、iが=(INTを<)( K); iは++){CIN >> [I]。}
 の#define MOD(x)は、((X)%9973)
 の#define試験COUT << "++++++" << ENDL。
typedefの長い 長いLL。
const  int型 MAXN = 10000 + 5 INT DIR [ 4 ] [ 2 ] = { 10、 - 10010、 - 1 }。// 单位移动
int型 DR [8 ] [ 2 ] = { 212、 - 1、 - 21、 - 2、 - 112、 - 121、 - 2、 - 1、 - 2 }。// 马走日
のint VIS [ 11 ] [ 11 ]。
int型、T、N、M、X、Y、ANS、CNT。
ボイド DFS(INT R、INT C)
{ 
    もし(ANS ==のN×m個){CNT ++ ;再;}
     ためint型 i = 0 ; iは< 8 ; iは++ 
    { 
        int型 NX = R + DR [i]が[ 0 ]。
        INT NY = C + DR [I] [ 1 ]。
        もし(!VIS [NX] [NY] && NX <= N &&がnx> 0 && NY <= M && NY> 0 
        { 
             ANS ++ 
             VIS [NX] [nyは] = 1 
             DFS(NX、NY)。
             VIS [NX] [nyは] = 0 
             ANS - ;
        }
    } 
} 
int型のmain()
{ 
    TLE。
    (; T; CIN >> T t-- 
    { 
        ANS = 1 ; CNT = 0 
        CIN >> N >> M >> X >> Y。
        以下のためにint型 i = 0 ; iが<= N; I ++ のためのINT J = 0 ; J <= Mであり、j ++ 
                VIS [I] [J] = 0 ; 
        VIS [X + 1 ] [Y + 1 ] = 1 
        DFS(X 1+ 、Y + 1 )。
        coutの << CNT << てendl; 
    } 
  0を返します。
}

 

おすすめ

転載: www.cnblogs.com/Shallow-dream/p/11453855.html